From 70fd5bb19cac705414861d86992c7d88cb7ddd84 Mon Sep 17 00:00:00 2001 From: wes Date: Wed, 20 Nov 2019 16:35:05 -0500 Subject: [PATCH 1/4] PersonFactory tests passing --- looptest.iml | 8 ++++---- .../streams/anthropoid/PersonFactory.java | 8 +++++--- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/looptest.iml b/looptest.iml index 7f2d304..792af39 100644 --- a/looptest.iml +++ b/looptest.iml @@ -10,10 +10,10 @@ - + - - - + + + \ No newline at end of file diff --git a/src/main/java/com/zipcodewilmington/streams/anthropoid/PersonFactory.java b/src/main/java/com/zipcodewilmington/streams/anthropoid/PersonFactory.java index a10ec7b..9a3924f 100644 --- a/src/main/java/com/zipcodewilmington/streams/anthropoid/PersonFactory.java +++ b/src/main/java/com/zipcodewilmington/streams/anthropoid/PersonFactory.java @@ -3,6 +3,8 @@ import com.zipcodewilmington.streams.tools.RandomUtils; import com.zipcodewilmington.streams.tools.StringUtils; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.stream.Collectors; @@ -39,7 +41,7 @@ public Person createRandomPerson() { * @return - ArrayList of Person objects */ // TODO public List createPersonList(int listSize) { - return null; + return createPersonStream(listSize).collect(Collectors.toList()); } @@ -48,7 +50,7 @@ public List createPersonList(int listSize) { * @return - Array of Person objects */ // TODO public Person[] createPersonArray(int arrayLength) { - return null; + return createPersonStream(arrayLength).collect(Collectors.toList()).toArray(new Person[arrayLength]); } @@ -59,6 +61,6 @@ public Person[] createPersonArray(int arrayLength) { * @return - Stream representation of collection of Person objects */ // TODO public Stream createPersonStream(int streamCount) { - return null; + return Stream.generate(new PersonFactory()::createRandomPerson).limit(streamCount); } } From 734bb90e80fa654c7c133b0c62883ff16090a992 Mon Sep 17 00:00:00 2001 From: wes Date: Wed, 20 Nov 2019 18:14:13 -0500 Subject: [PATCH 2/4] getUniquelyNamedPeople expected test result depends on random --- .../streams/anthropoid/PersonWarehouse.java | 24 ++++++++++++------- .../streams/conversions/ArrayConverter.java | 4 ++-- .../streams/conversions/ListConverter.java | 5 ++-- .../streams/conversions/StreamConverter.java | 6 ++--- .../anthropoid/TestPersonWarehouse.java | 6 +++++ 5 files changed, 30 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/zipcodewilmington/streams/anthropoid/PersonWarehouse.java b/src/main/java/com/zipcodewilmington/streams/anthropoid/PersonWarehouse.java index a4960b1..b9e3fbf 100644 --- a/src/main/java/com/zipcodewilmington/streams/anthropoid/PersonWarehouse.java +++ b/src/main/java/com/zipcodewilmington/streams/anthropoid/PersonWarehouse.java @@ -4,10 +4,8 @@ import com.zipcodewilmington.streams.tools.logging.LoggerHandler; import com.zipcodewilmington.streams.tools.logging.LoggerWarehouse; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Map; +import java.util.*; +import java.util.stream.Collector; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -36,15 +34,25 @@ public void addPerson(Person person) { * @return list of names of Person objects */ // TODO public List getNames() { - return null; + return people.stream().map(Person::getName).collect(Collectors.toList()); } /** * @return list of uniquely named Person objects + * this method is not looking for unique names, but rather the first occurrence of each name */ //TODO public Stream getUniquelyNamedPeople() { - return null; + return people.stream() + .collect(Collectors.groupingBy(Person::getName)) + .values() + .stream() + .map(p -> p.get(0)); +// .sorted(Collections.reverseOrder()); + } + + public Boolean checkUniqueName(String name) { + return getNames().stream().filter(n -> n.equals(name)).count() == Long.valueOf(1); } @@ -53,7 +61,7 @@ public Stream getUniquelyNamedPeople() { * @return a Stream of respective */ //TODO public Stream getUniquelyNamedPeopleStartingWith(Character character) { - return null; + return getUniquelyNamedPeople().filter(person -> person.getName().charAt(0) == character); } /** @@ -61,7 +69,7 @@ public Stream getUniquelyNamedPeopleStartingWith(Character character) { * @return a Stream of respective */ //TODO public Stream getFirstNUniquelyNamedPeople(int n) { - return null; + return people.stream().filter(person -> checkUniqueName(person.getName())).limit(n); } /** diff --git a/src/main/java/com/zipcodewilmington/streams/conversions/ArrayConverter.java b/src/main/java/com/zipcodewilmington/streams/conversions/ArrayConverter.java index 0a9d4d8..983a456 100644 --- a/src/main/java/com/zipcodewilmington/streams/conversions/ArrayConverter.java +++ b/src/main/java/com/zipcodewilmington/streams/conversions/ArrayConverter.java @@ -25,12 +25,12 @@ public ArrayConverter(int collectionSize) { //TODO public List toList() { - return null; + return this.toStream().collect(Collectors.toList()); } //TODO public Stream toStream() { - return null; + return Arrays.stream(objectSequence); } @Override diff --git a/src/main/java/com/zipcodewilmington/streams/conversions/ListConverter.java b/src/main/java/com/zipcodewilmington/streams/conversions/ListConverter.java index b64540b..df03fb9 100644 --- a/src/main/java/com/zipcodewilmington/streams/conversions/ListConverter.java +++ b/src/main/java/com/zipcodewilmington/streams/conversions/ListConverter.java @@ -3,6 +3,7 @@ import com.zipcodewilmington.streams.anthropoid.Person; import com.zipcodewilmington.streams.anthropoid.PersonFactory; +import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -29,11 +30,11 @@ public List toList() { //TODO public Stream toStream() { - return null; + return this.toList().stream(); } //TODO public Person[] toArray() { - return null; + return this.toStream().collect(Collectors.toList()).toArray(new Person[0]); } } diff --git a/src/main/java/com/zipcodewilmington/streams/conversions/StreamConverter.java b/src/main/java/com/zipcodewilmington/streams/conversions/StreamConverter.java index 159d048..f87ee47 100644 --- a/src/main/java/com/zipcodewilmington/streams/conversions/StreamConverter.java +++ b/src/main/java/com/zipcodewilmington/streams/conversions/StreamConverter.java @@ -25,16 +25,16 @@ public StreamConverter(int collectionSize) { // TODO public List toList() { - return null; + return this.toStream().collect(Collectors.toList()); } // TODO public Stream toStream() { - return null; + return personList.stream(); } // TODO public Person[] toArray() { - return null; + return this.toList().toArray(new Person[0]); } } diff --git a/src/test/java/com/zipcodewilmington/streams/anthropoid/TestPersonWarehouse.java b/src/test/java/com/zipcodewilmington/streams/anthropoid/TestPersonWarehouse.java index 25caaf9..a5086f6 100644 --- a/src/test/java/com/zipcodewilmington/streams/anthropoid/TestPersonWarehouse.java +++ b/src/test/java/com/zipcodewilmington/streams/anthropoid/TestPersonWarehouse.java @@ -76,4 +76,10 @@ public void testGetNames() { Assert.assertEquals(localNames.toString(), warehouseNames.toString()); } + + @Test + public void testCheckUniqueName() { + warehouse.addPerson(new Person("Johny", true, 23L, new Date(), new String[0])); + Assert.assertTrue(this.warehouse.checkUniqueName("Johny")); + } } From d5658da8f5ed8b6c8009b79e2846e718b1390bf6 Mon Sep 17 00:00:00 2001 From: wes Date: Sat, 23 Nov 2019 16:18:00 -0500 Subject: [PATCH 3/4] getUniquelyNamedPeople fixed --- .../streams/StreamFilter.java | 1 - .../streams/anthropoid/PersonWarehouse.java | 27 ++++++++++++------- .../anthropoid/TestPersonWarehouse.java | 15 +++++++++++ 3 files changed, 32 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/zipcodewilmington/streams/StreamFilter.java b/src/main/java/com/zipcodewilmington/streams/StreamFilter.java index d8b89ae..3729fb6 100644 --- a/src/main/java/com/zipcodewilmington/streams/StreamFilter.java +++ b/src/main/java/com/zipcodewilmington/streams/StreamFilter.java @@ -15,7 +15,6 @@ public class StreamFilter { private final Stream personStream; public final String startingCharacter; - /** * No arg constructor */ //TODO - construct person stream of 100 person objects; startingCharacter is a random capital letter diff --git a/src/main/java/com/zipcodewilmington/streams/anthropoid/PersonWarehouse.java b/src/main/java/com/zipcodewilmington/streams/anthropoid/PersonWarehouse.java index b9e3fbf..6dfb1fb 100644 --- a/src/main/java/com/zipcodewilmington/streams/anthropoid/PersonWarehouse.java +++ b/src/main/java/com/zipcodewilmington/streams/anthropoid/PersonWarehouse.java @@ -5,6 +5,9 @@ import com.zipcodewilmington.streams.tools.logging.LoggerWarehouse; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; +import java.util.function.Predicate; import java.util.stream.Collector; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -37,18 +40,18 @@ public List getNames() { return people.stream().map(Person::getName).collect(Collectors.toList()); } + public Predicate distinctByKey(Function keyExtractor) { + Set seen = ConcurrentHashMap.newKeySet(); + return t -> seen.add(keyExtractor.apply(t)); + } + /** * @return list of uniquely named Person objects * this method is not looking for unique names, but rather the first occurrence of each name */ //TODO public Stream getUniquelyNamedPeople() { - return people.stream() - .collect(Collectors.groupingBy(Person::getName)) - .values() - .stream() - .map(p -> p.get(0)); -// .sorted(Collections.reverseOrder()); + return people.stream().filter(distinctByKey(Person::getName)); } public Boolean checkUniqueName(String name) { @@ -69,14 +72,16 @@ public Stream getUniquelyNamedPeopleStartingWith(Character character) { * @return a Stream of respective */ //TODO public Stream getFirstNUniquelyNamedPeople(int n) { - return people.stream().filter(person -> checkUniqueName(person.getName())).limit(n); + return getUniquelyNamedPeople().limit(n); } /** * @return a mapping of Person Id to the respective Person name */ // TODO public Map getIdToNameMap() { - return null; + Map map = new HashMap<>(); + people.forEach(person -> map.put(person.getPersonalId(), person.getName())); + return map; } @@ -84,7 +89,7 @@ public Map getIdToNameMap() { * @return Stream of Stream of Aliases */ // TODO public Stream> getNestedAliases() { - return null; + return people.stream().map(person -> Arrays.stream(person.getAliases())); } @@ -92,7 +97,9 @@ public Stream> getNestedAliases() { * @return Stream of all Aliases */ // TODO public Stream getAllAliases() { - return null; + ArrayList actual = new ArrayList<>(); + getNestedAliases().forEach(stream -> actual.addAll(stream.collect(Collectors.toList()))); + return actual.stream(); } // DO NOT MODIFY diff --git a/src/test/java/com/zipcodewilmington/streams/anthropoid/TestPersonWarehouse.java b/src/test/java/com/zipcodewilmington/streams/anthropoid/TestPersonWarehouse.java index a5086f6..1eb596b 100644 --- a/src/test/java/com/zipcodewilmington/streams/anthropoid/TestPersonWarehouse.java +++ b/src/test/java/com/zipcodewilmington/streams/anthropoid/TestPersonWarehouse.java @@ -82,4 +82,19 @@ public void testCheckUniqueName() { warehouse.addPerson(new Person("Johny", true, 23L, new Date(), new String[0])); Assert.assertTrue(this.warehouse.checkUniqueName("Johny")); } + + @Test + public void testGetNestedAliases() { + ArrayList actual = new ArrayList<>(); + for (Stream streamer : warehouse.getNestedAliases().collect(Collectors.toList())) { + actual.addAll(streamer.collect(Collectors.toList())); + } + Assert.assertEquals(49995, actual.size()); + } + +// @Test +// public void testGetAllAliases() { +// ArrayList actual = warehouse.getAllAliases().collect(Collectors.toList()); +// Assert.assertEquals(49995, actual.size()); +// } } From e6b30321187fb95d9bee99589fbed829fa4cee36 Mon Sep 17 00:00:00 2001 From: wes Date: Sat, 23 Nov 2019 17:15:39 -0500 Subject: [PATCH 4/4] all tests passing except TestConversionAgent has initialization error --- .../streams/StreamFilter.java | 31 ++++++++++++++----- .../zipcodewilmington/streams/StreamMap.java | 11 +++++-- 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/zipcodewilmington/streams/StreamFilter.java b/src/main/java/com/zipcodewilmington/streams/StreamFilter.java index 3729fb6..f0f5ee4 100644 --- a/src/main/java/com/zipcodewilmington/streams/StreamFilter.java +++ b/src/main/java/com/zipcodewilmington/streams/StreamFilter.java @@ -5,6 +5,7 @@ import com.zipcodewilmington.streams.tools.RandomUtils; import com.zipcodewilmington.streams.tools.StringUtils; +import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -15,11 +16,18 @@ public class StreamFilter { private final Stream personStream; public final String startingCharacter; + public final String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; /** * No arg constructor */ //TODO - construct person stream of 100 person objects; startingCharacter is a random capital letter public StreamFilter() { - this(Stream.empty(), null); + this.personStream = Stream.generate(new PersonFactory()::createRandomPerson).limit(100); + this.startingCharacter = randomLetter(); + } + + public String randomLetter() { + Integer index = (int) Math.round(Math.random() * 26); + return this.alphabet.substring(index, index+1); } /** @@ -27,7 +35,7 @@ public StreamFilter() { * @param startingCharacter - character to filter by */ //TODO public StreamFilter(Person[] people, Character startingCharacter) { - this(Stream.empty(), null); + this(Arrays.stream(people), startingCharacter); } /** @@ -35,7 +43,7 @@ public StreamFilter(Person[] people, Character startingCharacter) { * @param startingCharacter - character to filter by */ //TODO public StreamFilter(List people, Character startingCharacter) { - this(Stream.empty(), null); + this(people.stream(), startingCharacter); } @@ -54,7 +62,11 @@ public StreamFilter(Stream people, Character startingCharacter) { * @return a list of person object whose name starts with `this.startingCharacter` */ //TODO public List toListMultiLine() { - return null; + return this.personStream.filter(person -> { + String nameChar = person.getName().substring(0,1); + Boolean cool = nameChar.equalsIgnoreCase(startingCharacter); + return cool; + }).collect(Collectors.toList()); } @@ -63,7 +75,9 @@ public List toListMultiLine() { * @return a list of person objects whose name starts with `this.startingCharacter` */ //TODO public List toListOneLine() { - return null; + return this.personStream + .filter(person -> person.getName().substring(0,1).equalsIgnoreCase(startingCharacter)) + .collect(Collectors.toList()); } @@ -72,7 +86,10 @@ public List toListOneLine() { * @return an array of person object whose name starts with `this.startingCharacter` */ //TODO public Person[] toArrayOneLine() { - return null; + return this.personStream + .filter(person -> person.getName().substring(0,1).equalsIgnoreCase(startingCharacter)) + .collect(Collectors.toList()) + .toArray(new Person[0]); } @@ -81,7 +98,7 @@ public Person[] toArrayOneLine() { * @return an array of person object whose name starts with `this.startingCharacter` */ //TODO public Person[] toArrayMultiLine() { - return null; + return toListMultiLine().toArray(new Person[0]); } } diff --git a/src/main/java/com/zipcodewilmington/streams/StreamMap.java b/src/main/java/com/zipcodewilmington/streams/StreamMap.java index cf35024..6186fa6 100644 --- a/src/main/java/com/zipcodewilmington/streams/StreamMap.java +++ b/src/main/java/com/zipcodewilmington/streams/StreamMap.java @@ -3,6 +3,7 @@ import com.zipcodewilmington.streams.anthropoid.Person; import com.zipcodewilmington.streams.conversions.StreamConverter; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @@ -18,7 +19,7 @@ public class StreamMap { * @return - a Stream of single characters */ //TODO public static Stream letters(String someWord) { - return null; + return Arrays.stream(someWord.split("")); } /** @@ -26,7 +27,11 @@ public static Stream letters(String someWord) { * @return - a Stream of several Streams of single characters */ //TODO public static Stream> wordsMap(String... someWords) { - return null; +// ArrayList> out = new ArrayList<>(); +// Arrays.stream(someWords).forEach(someWord -> out.add(letters(someWord))); +// return out.stream(); + return Arrays.stream(someWords).map(someWord -> letters(someWord)); + } /** @@ -34,6 +39,6 @@ public static Stream> wordsMap(String... someWords) { * @return - a Stream of several Streams of single characters */ //TODO public static Stream wordsFlatMap(String... stringArray) { - return null; + return Arrays.stream(stringArray).flatMap(someWord -> letters(someWord)); } } \ No newline at end of file