diff --git a/src/main/java/oving5/RPNCalc.java b/src/main/java/oving5/RPNCalc.java index 289f843..749b5cc 100644 --- a/src/main/java/oving5/RPNCalc.java +++ b/src/main/java/oving5/RPNCalc.java @@ -1,25 +1,65 @@ package oving5; import java.util.function.BinaryOperator; +import java.util.Stack; +import java.util.HashMap; public class RPNCalc { + private HashMap> ops = new HashMap>(); + private Stack stack = new Stack<>(); + RPNCalc() { } - public void performOperation(char c) { + boolean addOperator(char op, BinaryOperator f) { + if (ops.containsKey(op) || f == null) { + return false; + } + ops.put(op, f); + return true; } - public void removeOperator(char c) { + void push(double n) { + stack.push(n); } - public boolean addOperator(char c, BinaryOperator d) { - return false; + double pop() { + if (stack.isEmpty()) { + return Double.NaN; + } + return stack.pop(); } - public Double pop() { - return 0.0; + double peek(int i) { + int id = stack.size() - i; + if (id < 0 || id >= stack.size()) { + return Double.NaN; + } + return stack.get(id); } - public void push(int i) { + int getSize() { + return stack.size(); } + + void performOperation(char c) { + BinaryOperator op = ops.get(c); + + if (op == null) { + throw new UnsupportedOperationException("Invalid operator: " + c); + } + + if (stack.size() <= 1) { + return; + } + double a = stack.pop(); + double b = stack.pop(); + + stack.push(op.apply(b, a)); + } + + void removeOperator(char c) { + ops.remove(c); + } + } diff --git a/src/main/java/oving5/named/Named.java b/src/main/java/oving5/named/Named.java new file mode 100644 index 0000000..a597540 --- /dev/null +++ b/src/main/java/oving5/named/Named.java @@ -0,0 +1,10 @@ +package oving5.named; + +public interface Named { + String getFullName(); + String getFamilyName(); + String getGivenName(); + void setGivenName(String name); + void setFamilyName(String name); + void setFullName(String name); +} diff --git a/src/main/java/oving5/named/NamedComparator.java b/src/main/java/oving5/named/NamedComparator.java new file mode 100644 index 0000000..b59176c --- /dev/null +++ b/src/main/java/oving5/named/NamedComparator.java @@ -0,0 +1,14 @@ +package oving5.named; + +import java.util.Comparator; + +public class NamedComparator implements Comparator { + @Override + public int compare(Named named1, Named named2) { + int a = named1.getFamilyName().compareTo(named2.getFamilyName()); + if (a == 0) { + return named1.getGivenName().compareTo(named2.getGivenName()); + } + return a; + } +} diff --git a/src/main/java/oving5/named/Person1.java b/src/main/java/oving5/named/Person1.java index 46ce63f..f785e56 100644 --- a/src/main/java/oving5/named/Person1.java +++ b/src/main/java/oving5/named/Person1.java @@ -1,28 +1,43 @@ package oving5.named; -public class Person1 { - Person1(String s) { +public class Person1 implements Named { + private String givenName; + private String familyName; + private String fullName; + + Person1(String givenName, String familyName) { + setFullName(givenName + " " + familyName); + setGivenName(givenName); + setFamilyName(familyName); } - public void setFullName(String s) { + public void setFullName(String fullName) { + this.fullName = fullName; + String[] l = fullName.split(" "); + givenName = (l[0]); + familyName = (l[1]); } - public void setFamilyName(String s) { + public void setFamilyName(String familyName) { + this.familyName = familyName; + setFullName(givenName + " " + familyName); } - public void setGivenName(String s) { + public void setGivenName(String givenName) { + this.givenName = givenName; + setFullName(givenName + " " + familyName); } public String getFullName() { - return ""; + return fullName; } public String getFamilyName() { - return ""; + return familyName; } public String getGivenName() { - return ""; + return givenName; } } diff --git a/src/main/java/oving5/named/Person2.java b/src/main/java/oving5/named/Person2.java index 76d62d2..9c67921 100644 --- a/src/main/java/oving5/named/Person2.java +++ b/src/main/java/oving5/named/Person2.java @@ -1,28 +1,41 @@ package oving5.named; -public class Person2 { - Person2(String s) { +public class Person2 implements Named { + private String fullName; + private String familyName; + private String givenName; + + Person2(String fullName) { + setFullName(fullName); } - public void setFullName(String s) { + public void setFullName(String fullName) { + this.fullName = fullName; + String[] l = fullName.split(" "); + givenName = l[0]; + familyName = l[1]; } - public void setFamilyName(String s) { + public void setFamilyName(String familyName) { + this.familyName = familyName; + fullName = givenName + " " + familyName; } - public void setGivenName(String s) { + public void setGivenName(String givenName) { + this.givenName = givenName; + fullName = givenName + " " + familyName; } public String getFullName() { - return ""; + return fullName; } public String getFamilyName() { - return ""; + return familyName; } public String getGivenName() { - return ""; + return givenName; } } diff --git a/src/test/java/oving5/RPNCalcTest.java.unimplemented b/src/test/java/oving5/RPNCalcTest.java similarity index 100% rename from src/test/java/oving5/RPNCalcTest.java.unimplemented rename to src/test/java/oving5/RPNCalcTest.java diff --git a/src/test/java/oving5/named/NamedComparatorTest.java.unimplemented b/src/test/java/oving5/named/NamedComparatorTest.java similarity index 100% rename from src/test/java/oving5/named/NamedComparatorTest.java.unimplemented rename to src/test/java/oving5/named/NamedComparatorTest.java diff --git a/src/test/java/oving5/named/Person1Test.java.unimplemented b/src/test/java/oving5/named/Person1Test.java similarity index 100% rename from src/test/java/oving5/named/Person1Test.java.unimplemented rename to src/test/java/oving5/named/Person1Test.java diff --git a/src/test/java/oving5/named/Person2Test.java.unimplemented b/src/test/java/oving5/named/Person2Test.java similarity index 100% rename from src/test/java/oving5/named/Person2Test.java.unimplemented rename to src/test/java/oving5/named/Person2Test.java