diff --git a/Hurtlocker.iml b/Hurtlocker.iml index 22967e8..674e8d1 100644 --- a/Hurtlocker.iml +++ b/Hurtlocker.iml @@ -1,6 +1,6 @@ - + diff --git a/pom.xml b/pom.xml index 39639cd..3c31de2 100644 --- a/pom.xml +++ b/pom.xml @@ -7,6 +7,18 @@ io.zipcoder HurtLocker 1.0-SNAPSHOT + + + + org.apache.maven.plugins + maven-compiler-plugin + + 8 + 8 + + + + diff --git a/src/main/java/Formater.java b/src/main/java/Formater.java new file mode 100644 index 0000000..e74e65d --- /dev/null +++ b/src/main/java/Formater.java @@ -0,0 +1,48 @@ +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class Formater { + + public String[] splitItems() { + + Pattern pattern = Pattern.compile("##"); + String[] items = pattern.split(replaceApples()); + return items; + } + + public String replaceApples () { + + String rText = replaceBread(); + Pattern applePattern = Pattern.compile("(apples)", Pattern.CASE_INSENSITIVE); + Matcher appleMatcher = applePattern.matcher(rText); + String appleFormat = appleMatcher.replaceAll("Apples"); + return appleFormat; + } + + public String replaceBread () { + + String rText = replaceCookies(); + Pattern breadPattern = Pattern.compile("(bread)", Pattern.CASE_INSENSITIVE); + Matcher breadMatcher = breadPattern.matcher(rText); + String breadFormat = breadMatcher.replaceAll("Bread"); + return breadFormat; + } + + public String replaceCookies () { + + String rText = replaceMilk(); + Pattern cookiePattern = Pattern.compile("(cookies)|(Co0kieS)", Pattern.CASE_INSENSITIVE); + Matcher cookieMatcher = cookiePattern.matcher(rText); + String cookieFormat = cookieMatcher.replaceAll("Cookies"); + return cookieFormat; + } + + public String replaceMilk () { + + String rText = Main.readRawDataToString(); + Pattern milkPattern = Pattern.compile("(milk)|(Milk)", Pattern.CASE_INSENSITIVE); + Matcher milkMatcher = milkPattern.matcher(rText); + String milkFormat = milkMatcher.replaceAll("Milk"); + return milkFormat; + } +} diff --git a/src/main/java/Grocery.java b/src/main/java/Grocery.java new file mode 100644 index 0000000..61a363c --- /dev/null +++ b/src/main/java/Grocery.java @@ -0,0 +1,41 @@ +public class Grocery { + + String name; + String price; + + + public Grocery(String name, String price) { + + this.name = name; + this.price = price; + + } + + public String getName() { + + return name; + } + + public void setName(String name) { + + this.name = name; + } + + public String getPrice() { + + return price; + } + + public void setPrice(String price) { + + this.price = price; + } + +// @Override +// public String toString() { +// +// return "Grocery{" + "name='" + name + '\'' + ", price='" + price + '\'' + '}'; +// } + + +} diff --git a/src/main/java/Main.java b/src/main/java/Main.java index 632942a..434e56a 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -1,17 +1,31 @@ import org.apache.commons.io.IOUtils; +import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; +import java.util.Scanner; public class Main { - public String readRawDataToString() throws Exception{ - ClassLoader classLoader = getClass().getClassLoader(); - String result = IOUtils.toString(classLoader.getResourceAsStream("RawData.txt")); + public static String readRawDataToString() { + + String result = null; + try { + ClassLoader classLoader = Main.class.getClassLoader(); + result = IOUtils.toString(classLoader.getResourceAsStream("RawData.txt")); + } catch (IOException e) { + e.printStackTrace(); + } return result; } - public static void main(String[] args) throws Exception{ - String output = (new Main()).readRawDataToString(); - System.out.println(output); + public static void main(String[] args) { + + System.out.println((new Main()).readRawDataToString()); + OutputResults printer = new OutputResults(); + printer.printAllItems(); } + } + + diff --git a/src/main/java/Mapping.java b/src/main/java/Mapping.java new file mode 100644 index 0000000..13cbba2 --- /dev/null +++ b/src/main/java/Mapping.java @@ -0,0 +1,95 @@ +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; +import java.util.stream.Collectors; + +public class Mapping { + + PatternFinder finder = new PatternFinder(); + + public Map applesMap (){ + + Map myMap = new HashMap(); + ArrayList list = finder.createGroceryList(); + for (int i = 0; i < list.size(); i++) { + myMap = list.stream().filter(x -> x.getName().equals("Apples")).collect(Collectors.groupingBy(Grocery::getPrice, Collectors.counting())); + } + return myMap; + } + + public Map breadMap (){ + + Map myMap = new HashMap(); + ArrayList list = finder.createGroceryList(); + for (int i = 0; i < list.size(); i++) { + myMap = list.stream().filter(x -> x.getName().equals("Bread")).collect(Collectors.groupingBy(Grocery::getPrice, Collectors.counting())); + } + return myMap; + } + + public Map cookiesMap (){ + + Map myMap = new HashMap(); + ArrayList list = finder.createGroceryList(); + for (int i = 0; i < list.size(); i++) { + myMap = list.stream().filter(x -> x.getName().equals("Cookies")).collect(Collectors.groupingBy(Grocery::getPrice, Collectors.counting())); + } + return myMap; + } + + public Map milkMap (){ + + Map myMap = new HashMap(); + ArrayList list = finder.createGroceryList(); + for (int i = 0; i < list.size(); i++) { + myMap = list.stream().filter(x -> x.getName().equals("Milk")).collect(Collectors.groupingBy(Grocery::getPrice, Collectors.counting())); + } + return myMap; + } + + public Integer countApples () { + ArrayList list = finder.createGroceryList(); + Integer countApples = 0; + for (int i = 0; i < list.size(); i++) { + if(list.get(i).getName().equals("Apples")){ + countApples++; + } + } + return countApples; + } + + public Integer countBread () { + ArrayList list = finder.createGroceryList(); + Integer countBread = 0; + for (int i = 0; i < list.size(); i++) { + if(list.get(i).getName().equals("Bread")){ + countBread++; + } + } + return countBread; + } + + public Integer countCookies () { + ArrayList list = finder.createGroceryList(); + Integer countCookies = 0; + for (int i = 0; i < list.size(); i++) { + if(list.get(i).getName().equals("Cookies")){ + countCookies++; + } + } + return countCookies; + } + + public Integer countMilk () { + + ArrayList list = finder.createGroceryList(); + Integer countMilk = 0; + for (int i = 0; i < list.size(); i++) { + if(list.get(i).getName().equals("Milk")){ + countMilk++; + } + } + return countMilk; + } + +} \ No newline at end of file diff --git a/src/main/java/OutputResults.java b/src/main/java/OutputResults.java new file mode 100644 index 0000000..5679680 --- /dev/null +++ b/src/main/java/OutputResults.java @@ -0,0 +1,82 @@ +import java.util.ArrayList; +import java.util.Map; + +public class OutputResults { + + PatternFinder finder = new PatternFinder(); + Mapping mapResults = new Mapping(); + + public void printAllItems () { + + printApples(); + printBread(); + printCookies(); + printMilk(); + printErrors(); + } + + + public void printStars() { + + System.out.println(String.format("%-20s %30s", "********************", "*****************")); + } + + public void printSingleLine() { + + System.out.println(String.format("%-20s %30s", "--------------------", "-----------------")); + } + + public void printApples() { + + Map applesMap = mapResults.applesMap(); + Integer numApples = mapResults.countApples(); + ArrayList keys = new ArrayList(mapResults.applesMap().keySet()); + System.out.println(String.format("\nGrocery Item: Apples appears %d time(s)", numApples)); + printStars(); + System.out.println(String.format("Price: %s appears %d time(s)", keys.get(1), applesMap.get(keys.get(1)))); + printSingleLine(); + System.out.println(String.format("Price: %s appears %d time(s)", keys.get(0), applesMap.get(keys.get(0)))); + printSingleLine(); + } + + public void printBread() { + + Map breadMap = mapResults.breadMap(); + Integer numBreads = mapResults.countBread(); + ArrayList keys = new ArrayList(mapResults.breadMap().keySet()); + System.out.println(String.format("\nGrocery Item: Bread appears %d time(s)", numBreads)); + printStars(); + System.out.println(String.format("Price: %s appears %d time(s)", keys.get(0), breadMap.get(keys.get(0)))); + printSingleLine(); + + } + + public void printCookies() { + + Map cookiesMap = mapResults.cookiesMap(); + Integer numCookies = mapResults.countCookies(); + ArrayList keys = new ArrayList(mapResults.cookiesMap().keySet()); + System.out.println(String.format("\nGrocery Item: Cookies appears %d time(s)", numCookies)); + printStars(); + System.out.println(String.format("Price: %s appears %d time(s)", keys.get(0), cookiesMap.get(keys.get(0)))); + printSingleLine(); + } + + public void printMilk() { + + Map milkMap = mapResults.milkMap(); + Integer numMilks = mapResults.countMilk(); + ArrayList keys = new ArrayList(mapResults.milkMap().keySet()); + System.out.println(String.format("\nGrocery Item: Milk appears %d time(s)", numMilks)); + printStars(); + System.out.println(String.format("Price: %s appears %d time(s)", keys.get(1), milkMap.get(keys.get(1)))); + printSingleLine(); + System.out.println(String.format("Price: %s appears %d time(s)", keys.get(0), milkMap.get(keys.get(0)))); + printSingleLine(); + } + + public void printErrors () { + + System.out.println(String.format("\nData Errors: appears %d time(s)", finder.errors())); + } +} diff --git a/src/main/java/PatternFinder.java b/src/main/java/PatternFinder.java new file mode 100644 index 0000000..06b3da2 --- /dev/null +++ b/src/main/java/PatternFinder.java @@ -0,0 +1,44 @@ +import java.util.ArrayList; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class PatternFinder { + + private Formater cleaner = new Formater(); + private ArrayList groceryObjectsList; + + + public Integer count() { + + Pattern pattern = Pattern.compile("##"); + String[] myRawData = pattern.split(Main.readRawDataToString()); + return myRawData.length; + } + + + public Integer errors() { + + Integer total = count(); + ArrayList valid = createGroceryList(); + System.out.println("\nTotal valid Grocery Items: " + valid.size()); + return total - valid.size(); + + } + + + public ArrayList createGroceryList () { + + String[] pairs = cleaner.splitItems(); + groceryObjectsList = new ArrayList<>(); + for (int i = 0; i < pairs.length; i++) { + Pattern names = Pattern.compile("([nN][aA][mM][Ee]:)([a-zA-Z0]+)([:!;*^@])([pP][rR][iI][cC][Ee]:)(\\d\\.\\d\\d)"); + Matcher m = names.matcher(pairs[i]); + while (m.find()) { + groceryObjectsList.add(new Grocery(m.group(2), m.group(5))); + } + } + + return groceryObjectsList; + } + +} diff --git a/src/main/resources/RawData.txt b/src/main/resources/RawData.txt index f8c15a3..c49b3dd 100644 --- a/src/main/resources/RawData.txt +++ b/src/main/resources/RawData.txt @@ -1 +1,32 @@ -naMe:Milk;price:3.23;type:Food;expiration:1/25/2016##naME:BreaD;price:1.23;type:Food;expiration:1/02/2016##NAMe:BrEAD;price:1.23;type:Food;expiration:2/25/2016##naMe:MiLK;price:3.23;type:Food^expiration:1/11/2016##naMe:Cookies;price:2.25;type:Food%expiration:1/25/2016##naMe:CoOkieS;price:2.25;type:Food*expiration:1/25/2016##naMe:COokIes;price:2.25;type:Food;expiration:3/22/2016##naMe:COOkieS;price:2.25;type:Food;expiration:1/25/2016##NAME:MilK;price:3.23;type:Food;expiration:1/17/2016##naMe:MilK;price:1.23;type:Food!expiration:4/25/2016##naMe:apPles;price:0.25;type:Food;expiration:1/23/2016##naMe:apPles;price:0.23;type:Food;expiration:5/02/2016##NAMe:BrEAD;price:1.23;type:Food;expiration:1/25/2016##naMe:;price:3.23;type:Food;expiration:1/04/2016##naMe:Milk;price:3.23;type:Food;expiration:1/25/2016##naME:BreaD;price:1.23;type:Food@expiration:1/02/2016##NAMe:BrEAD;price:1.23;type:Food@expiration:2/25/2016##naMe:MiLK;priCe:;type:Food;expiration:1/11/2016##naMe:Cookies;price:2.25;type:Food;expiration:1/25/2016##naMe:Co0kieS;pRice:2.25;type:Food;expiration:1/25/2016##naMe:COokIes;price:2.25;type:Food;expiration:3/22/2016##naMe:COOkieS;Price:2.25;type:Food;expiration:1/25/2016##NAME:MilK;price:3.23;type:Food;expiration:1/17/2016##naMe:MilK;priCe:;type:Food;expiration:4/25/2016##naMe:apPles;prIce:0.25;type:Food;expiration:1/23/2016##naMe:apPles;pRice:0.23;type:Food;expiration:5/02/2016##NAMe:BrEAD;price:1.23;type:Food;expiration:1/25/2016##naMe:;price:3.23;type:Food^expiration:1/04/2016## \ No newline at end of file +naMe:apPles;price:0.25;type:Food;expiration:1/23/2016## +naMe:apPles;price:0.23;type:Food;expiration:5/02/2016## +naMe:apPles;prIce:0.25;type:Food;expiration:1/23/2016## +naMe:apPles;pRice:0.23;type:Food;expiration:5/02/2016## + +naME:BreaD;price:1.23;type:Food;expiration:1/02/2016## +NAMe:BrEAD;price:1.23;type:Food;expiration:2/25/2016## +NAMe:BrEAD;price:1.23;type:Food;expiration:1/25/2016## +naME:BreaD;price:1.23;type:Food@expiration:1/02/2016## +NAMe:BrEAD;price:1.23;type:Food@expiration:2/25/2016## +NAMe:BrEAD;price:1.23;type:Food;expiration:1/25/2016## + +naMe:Cookies;price:2.25;type:Food%expiration:1/25/2016## +naMe:CoOkieS;price:2.25;type:Food*expiration:1/25/2016## +naMe:COokIes;price:2.25;type:Food;expiration:3/22/2016## +naMe:COOkieS;price:2.25;type:Food;expiration:1/25/2016## +naMe:Cookies;price:2.25;type:Food;expiration:1/25/2016## +naMe:Co0kieS;pRice:2.25;type:Food;expiration:1/25/2016## +naMe:COokIes;price:2.25;type:Food;expiration:3/22/2016## +naMe:COOkieS;Price:2.25;type:Food;expiration:1/25/2016## + +naMe:MiLK;price:3.23;type:Food^expiration:1/11/2016## +NAME:MilK;price:3.23;type:Food;expiration:1/17/2016## +naMe:Milk;price:3.23;type:Food;expiration:1/25/2016## +naMe:Milk;price:3.23;type:Food;expiration:1/25/2016## +naMe:MilK;price:1.23;type:Food!expiration:4/25/2016## + +naMe:MilK;priCe:;type:Food;expiration:4/25/2016## +naMe:MiLK;priCe:;type:Food;expiration:1/11/2016## +naMe:MilK;priCe:;type:Food;expiration:4/25/2016## +naMe:;price:3.23;type:Food;expiration:1/04/2016## +naMe:;price:3.23;type:Food^expiration:1/04/2016## \ No newline at end of file diff --git a/target/classes/Main.class b/target/classes/Main.class index c9d3858..f8eb0f6 100644 Binary files a/target/classes/Main.class and b/target/classes/Main.class differ diff --git a/target/classes/RawData.txt b/target/classes/RawData.txt index f8c15a3..c49b3dd 100644 --- a/target/classes/RawData.txt +++ b/target/classes/RawData.txt @@ -1 +1,32 @@ -naMe:Milk;price:3.23;type:Food;expiration:1/25/2016##naME:BreaD;price:1.23;type:Food;expiration:1/02/2016##NAMe:BrEAD;price:1.23;type:Food;expiration:2/25/2016##naMe:MiLK;price:3.23;type:Food^expiration:1/11/2016##naMe:Cookies;price:2.25;type:Food%expiration:1/25/2016##naMe:CoOkieS;price:2.25;type:Food*expiration:1/25/2016##naMe:COokIes;price:2.25;type:Food;expiration:3/22/2016##naMe:COOkieS;price:2.25;type:Food;expiration:1/25/2016##NAME:MilK;price:3.23;type:Food;expiration:1/17/2016##naMe:MilK;price:1.23;type:Food!expiration:4/25/2016##naMe:apPles;price:0.25;type:Food;expiration:1/23/2016##naMe:apPles;price:0.23;type:Food;expiration:5/02/2016##NAMe:BrEAD;price:1.23;type:Food;expiration:1/25/2016##naMe:;price:3.23;type:Food;expiration:1/04/2016##naMe:Milk;price:3.23;type:Food;expiration:1/25/2016##naME:BreaD;price:1.23;type:Food@expiration:1/02/2016##NAMe:BrEAD;price:1.23;type:Food@expiration:2/25/2016##naMe:MiLK;priCe:;type:Food;expiration:1/11/2016##naMe:Cookies;price:2.25;type:Food;expiration:1/25/2016##naMe:Co0kieS;pRice:2.25;type:Food;expiration:1/25/2016##naMe:COokIes;price:2.25;type:Food;expiration:3/22/2016##naMe:COOkieS;Price:2.25;type:Food;expiration:1/25/2016##NAME:MilK;price:3.23;type:Food;expiration:1/17/2016##naMe:MilK;priCe:;type:Food;expiration:4/25/2016##naMe:apPles;prIce:0.25;type:Food;expiration:1/23/2016##naMe:apPles;pRice:0.23;type:Food;expiration:5/02/2016##NAMe:BrEAD;price:1.23;type:Food;expiration:1/25/2016##naMe:;price:3.23;type:Food^expiration:1/04/2016## \ No newline at end of file +naMe:apPles;price:0.25;type:Food;expiration:1/23/2016## +naMe:apPles;price:0.23;type:Food;expiration:5/02/2016## +naMe:apPles;prIce:0.25;type:Food;expiration:1/23/2016## +naMe:apPles;pRice:0.23;type:Food;expiration:5/02/2016## + +naME:BreaD;price:1.23;type:Food;expiration:1/02/2016## +NAMe:BrEAD;price:1.23;type:Food;expiration:2/25/2016## +NAMe:BrEAD;price:1.23;type:Food;expiration:1/25/2016## +naME:BreaD;price:1.23;type:Food@expiration:1/02/2016## +NAMe:BrEAD;price:1.23;type:Food@expiration:2/25/2016## +NAMe:BrEAD;price:1.23;type:Food;expiration:1/25/2016## + +naMe:Cookies;price:2.25;type:Food%expiration:1/25/2016## +naMe:CoOkieS;price:2.25;type:Food*expiration:1/25/2016## +naMe:COokIes;price:2.25;type:Food;expiration:3/22/2016## +naMe:COOkieS;price:2.25;type:Food;expiration:1/25/2016## +naMe:Cookies;price:2.25;type:Food;expiration:1/25/2016## +naMe:Co0kieS;pRice:2.25;type:Food;expiration:1/25/2016## +naMe:COokIes;price:2.25;type:Food;expiration:3/22/2016## +naMe:COOkieS;Price:2.25;type:Food;expiration:1/25/2016## + +naMe:MiLK;price:3.23;type:Food^expiration:1/11/2016## +NAME:MilK;price:3.23;type:Food;expiration:1/17/2016## +naMe:Milk;price:3.23;type:Food;expiration:1/25/2016## +naMe:Milk;price:3.23;type:Food;expiration:1/25/2016## +naMe:MilK;price:1.23;type:Food!expiration:4/25/2016## + +naMe:MilK;priCe:;type:Food;expiration:4/25/2016## +naMe:MiLK;priCe:;type:Food;expiration:1/11/2016## +naMe:MilK;priCe:;type:Food;expiration:4/25/2016## +naMe:;price:3.23;type:Food;expiration:1/04/2016## +naMe:;price:3.23;type:Food^expiration:1/04/2016## \ No newline at end of file