From ae658efb37d57e5c8907f1881799ea529a0db279 Mon Sep 17 00:00:00 2001 From: NicholasWolak Date: Mon, 9 Aug 2021 15:01:18 -0400 Subject: [PATCH 1/2] possible solution --- Hurtlocker.iml | 18 ---- src/main/java/Grocery.java | 41 +++++++++ src/main/java/Main.java | 169 +++++++++++++++++++++++++++++++++++- src/main/test/MainTest.java | 48 ++++++++++ target/classes/Main.class | Bin 1162 -> 5541 bytes 5 files changed, 257 insertions(+), 19 deletions(-) delete mode 100644 Hurtlocker.iml create mode 100644 src/main/java/Grocery.java create mode 100644 src/main/test/MainTest.java diff --git a/Hurtlocker.iml b/Hurtlocker.iml deleted file mode 100644 index 22967e8..0000000 --- a/Hurtlocker.iml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/java/Grocery.java b/src/main/java/Grocery.java new file mode 100644 index 0000000..8515ff2 --- /dev/null +++ b/src/main/java/Grocery.java @@ -0,0 +1,41 @@ +import java.text.SimpleDateFormat; + +public class Grocery { + + String name; + Double price; + SimpleDateFormat date; + + public Grocery() { + } + + public Grocery(String name, Double price, SimpleDateFormat date) { + this.name = name; + this.price = price; + this.date = date; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Double getPrice() { + return price; + } + + public void setPrice(Double price) { + this.price = price; + } + + public SimpleDateFormat getDate() { + return date; + } + + public void setDate(SimpleDateFormat date) { + this.date = date; + } +} diff --git a/src/main/java/Main.java b/src/main/java/Main.java index 632942a..c33537c 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -1,8 +1,12 @@ import org.apache.commons.io.IOUtils; import java.io.IOException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; public class Main { + Integer counter = 0; + public String readRawDataToString() throws Exception{ ClassLoader classLoader = getClass().getClassLoader(); String result = IOUtils.toString(classLoader.getResourceAsStream("RawData.txt")); @@ -11,7 +15,170 @@ public String readRawDataToString() throws Exception{ public static void main(String[] args) throws Exception{ String output = (new Main()).readRawDataToString(); - System.out.println(output); + // String actualResult = changeCookies(changeApples(changeBread(changeMilk(output)))); + // System.out.println(actualResult); + + } + + public String changeMilk (String input) { + try { + Pattern pattern = Pattern.compile("milk", Pattern.CASE_INSENSITIVE); + Matcher matcher = pattern.matcher(input); + String milk = matcher.replaceAll("Milk"); + + return milk; + } catch (Exception e) { + throw new UnsupportedOperationException(); + } + } + + public String changeBread (String input) { + try { + Pattern pattern = Pattern.compile("bread", Pattern.CASE_INSENSITIVE); + Matcher matcher = pattern.matcher(input); + String milk = matcher.replaceAll("Bread"); + + return milk; + } catch (Exception e) { + throw new UnsupportedOperationException(); + } + } + + public String changeCookies (String input) { + try { + Pattern pattern = Pattern.compile("c[o0][o0]kies", Pattern.CASE_INSENSITIVE); + Matcher matcher = pattern.matcher(input); + String milk = matcher.replaceAll("Cookies"); + + return milk; + } catch (Exception e) { + throw new UnsupportedOperationException(); + } + } + + public String changeApples (String input) { + try { + Pattern pattern = Pattern.compile("apples", Pattern.CASE_INSENSITIVE); + Matcher matcher = pattern.matcher(input); + String milk = matcher.replaceAll("Apples"); + + return milk; + } catch (Exception e) { + throw new UnsupportedOperationException(); + } + } + + public String poundToNewLine(String input) { + try { + Pattern pattern = Pattern.compile("##"); + Matcher matcher = pattern.matcher(input); + String result = matcher.replaceAll("\n"); + return result; + } catch (Exception e) { + throw new UnsupportedOperationException(); + } + } + + public String correctSeparator () { + // "[!@^%*]" + try { + String jawn = readRawDataToString(); + Pattern patter = Pattern.compile("[!@^%*]"); + Matcher matcher = patter.matcher(jawn); + String result = matcher.replaceAll(";"); + return result; + } catch (Exception e) { + throw new UnsupportedOperationException(); + } + } + + public String nameChange(String input) { + try { + Pattern pattern = Pattern.compile("name", Pattern.CASE_INSENSITIVE); + Matcher matcher = pattern.matcher(input); + String milk = matcher.replaceAll("Name"); + + return milk; + } catch (Exception e) { + throw new UnsupportedOperationException(); + } + } + + public String priceChange(String input) { + try { + Pattern pattern = Pattern.compile("price", Pattern.CASE_INSENSITIVE); + Matcher matcher = pattern.matcher(input); + String milk = matcher.replaceAll("Price"); + + return milk; + } catch (Exception e) { + throw new UnsupportedOperationException(); + } + } + + public int findGroceries(String input) { + Integer holdingValue = 0; + Boolean checkVal = false; + Pattern pattern = Pattern.compile(input, Pattern.CASE_INSENSITIVE); + Matcher matcher = pattern.matcher(readyForFormatting()); + while(!checkVal) { + if (!matcher.find()) { + checkVal = true; + continue; + } + holdingValue++; + } + return holdingValue; + } + + + public String doingTheFormatting() { + String result = + "name: Milk seen: " + findGroceries("milk") + " times\n" + + "============= =============\n" + + "Price: 3.23 seen: " + findGroceries("milk;price:3.23") + " times\n" + + "------------- -------------\n" + + "Price: 1.23 seen: " + findGroceries("milk;price:1.23") + " times\n\n" + + + "name: Bread seen: " + findGroceries("bread") + " times\n" + + "============= =============\n" + + "Price: 1.23 seen: " + findGroceries("bread") + " times\n" + + "------------- -------------\n\n" + + + "name: Cookies seen: " + findGroceries("cookies") + " times\n" + + "============= =============\n" + + "Price: 2.25 seen: " + findGroceries("cookies") + " times\n" + + "------------- -------------\n\n" + + + "name: Apples seen: " + findGroceries("apples") + " times\n" + + "============= =============\n" + + "Price: 0.25 seen: " + findGroceries("price:0.25") + " times\n" + + "------------- -------------\n" + + "Price: 0.23 seen: " + findGroceries("price:0.23") + " times\n\n" + + + "Errors seen: " + countingErrors() + " times"; + return result; + } + + public int countingErrors() { + int counter = 0; + // beware + // receive 2 errors on 'milk' - milk shows more than the given prices (2 times) + // and there are 2 errors upon not having a price +// counter += findGroceries("apples") - (findGroceries("apples;price:0.25") + findGroceries("apples;price:0.23")); + counter += findGroceries("Name:;"); + counter += findGroceries("milk") - (findGroceries("milk;price:3.23") + findGroceries("milk;price:1.23")); + return counter; + } + public String readyForFormatting() { + String result = poundToNewLine(correctSeparator()); + String result1 = changeApples(result); + String result2 = changeBread(result1); + String result3 = changeCookies(result2); + String result4 = changeMilk(result3); + String result5 = nameChange(result4); + String result6 = priceChange(result5); + return result6; } } diff --git a/src/main/test/MainTest.java b/src/main/test/MainTest.java new file mode 100644 index 0000000..910c44c --- /dev/null +++ b/src/main/test/MainTest.java @@ -0,0 +1,48 @@ +import org.junit.Test; + +public class MainTest { + + Main test = new Main(); + +// @Test +// public void milkChangeTest() { +// String result = test.changeMilk(); +// System.out.println(result); +// } + + @Test + public void poundNewLineTest() { + String result = test.poundToNewLine(test.correctSeparator()); + System.out.println(result); + } + + @Test // weird output + public void correctedSeparatorTest() { + String result = test.correctSeparator(); + System.out.println(result); + } + +// @Test +// public void applesChangeTest() { +// String result = test.changeApples(); +// System.out.println(result); +// } + + @Test + public void entireFormattingTest() { + String result = test.poundToNewLine(test.correctSeparator()); + String result1 = test.changeApples(result); + String result2 = test.changeBread(result1); + String result3 = test.changeCookies(result2); + String result4 = test.changeMilk(result3); + String result5 = test.nameChange(result4); + String result6 = test.priceChange(result5); + System.out.println(result6); + } + + @Test + public void printTest() { + String result = test.doingTheFormatting(); + System.out.println(result); + } +} diff --git a/target/classes/Main.class b/target/classes/Main.class index c9d3858bc278f548c9eaabc471ed4e0ba034dcf0..25b962c06492ae1f8359a7eba3aaf94d437852bb 100644 GIT binary patch literal 5541 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 fda_TtMJ1 Date: Mon, 9 Aug 2021 15:27:26 -0400 Subject: [PATCH 2/2] refined solution --- src/main/java/Main.java | 37 ++++++++++++++++++++++++++----------- target/classes/Main.class | Bin 5541 -> 5662 bytes 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/src/main/java/Main.java b/src/main/java/Main.java index c33537c..0f083cb 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -5,8 +5,6 @@ public class Main { - Integer counter = 0; - public String readRawDataToString() throws Exception{ ClassLoader classLoader = getClass().getClassLoader(); String result = IOUtils.toString(classLoader.getResourceAsStream("RawData.txt")); @@ -49,7 +47,6 @@ public String changeCookies (String input) { Pattern pattern = Pattern.compile("c[o0][o0]kies", Pattern.CASE_INSENSITIVE); Matcher matcher = pattern.matcher(input); String milk = matcher.replaceAll("Cookies"); - return milk; } catch (Exception e) { throw new UnsupportedOperationException(); @@ -61,7 +58,6 @@ public String changeApples (String input) { Pattern pattern = Pattern.compile("apples", Pattern.CASE_INSENSITIVE); Matcher matcher = pattern.matcher(input); String milk = matcher.replaceAll("Apples"); - return milk; } catch (Exception e) { throw new UnsupportedOperationException(); @@ -97,7 +93,6 @@ public String nameChange(String input) { Pattern pattern = Pattern.compile("name", Pattern.CASE_INSENSITIVE); Matcher matcher = pattern.matcher(input); String milk = matcher.replaceAll("Name"); - return milk; } catch (Exception e) { throw new UnsupportedOperationException(); @@ -109,7 +104,6 @@ public String priceChange(String input) { Pattern pattern = Pattern.compile("price", Pattern.CASE_INSENSITIVE); Matcher matcher = pattern.matcher(input); String milk = matcher.replaceAll("Price"); - return milk; } catch (Exception e) { throw new UnsupportedOperationException(); @@ -117,7 +111,7 @@ public String priceChange(String input) { } public int findGroceries(String input) { - Integer holdingValue = 0; + Integer counter = 0; Boolean checkVal = false; Pattern pattern = Pattern.compile(input, Pattern.CASE_INSENSITIVE); Matcher matcher = pattern.matcher(readyForFormatting()); @@ -126,9 +120,9 @@ public int findGroceries(String input) { checkVal = true; continue; } - holdingValue++; + counter++; } - return holdingValue; + return counter; } @@ -164,8 +158,6 @@ public int countingErrors() { int counter = 0; // beware // receive 2 errors on 'milk' - milk shows more than the given prices (2 times) - // and there are 2 errors upon not having a price -// counter += findGroceries("apples") - (findGroceries("apples;price:0.25") + findGroceries("apples;price:0.23")); counter += findGroceries("Name:;"); counter += findGroceries("milk") - (findGroceries("milk;price:3.23") + findGroceries("milk;price:1.23")); return counter; @@ -181,4 +173,27 @@ public String readyForFormatting() { String result6 = priceChange(result5); return result6; } + + + + + + + + + + + + + + + + + + + public void parsingToObject(String input) { + Pattern pattern = Pattern.compile(input); + Matcher matcher = pattern.matcher(readyForFormatting()); + + } } diff --git a/target/classes/Main.class b/target/classes/Main.class index 25b962c06492ae1f8359a7eba3aaf94d437852bb..278f6f279123282ef95138517fe7585d9d0746c6 100644 GIT binary patch literal 5662 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 Rqk-m~cZPy@(|iry^B?*ZqIv)T literal 5541 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