Implement the person comparator :
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Tue, 15 Jan 2019 11:24:06 +0000 (12:24 +0100)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Tue, 15 Jan 2019 11:24:06 +0000 (12:24 +0100)
* Add a distance attribute in the Person class;
* Add helper function to compute the distance from a reference person;
* Display the person (text only for now) in the GUI.

Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
src/Eye.java
src/Firstname.java
src/Main.java
src/Origin.java
src/Person.java
src/PersonView.java
src/Size.java
src/SizeView.java
src/Utils.java [moved from src/LevenshteinDistance.java with 54% similarity]
src/Weight.java

index edaea1bb467c07f00a510e155804a25c7b952114..822e6f83dd3fc7aabc5bcf5d864671c828c6f999 100644 (file)
@@ -1,7 +1,7 @@
 import java.awt.Color;
 import java.util.Arrays;
 
-public class Eye implements Comparable<Eye> {
+public class Eye {
     private String strColor;
     private Color color;
     private String[] colorsList = {"black", "blue", "brown", "green"};
@@ -81,8 +81,7 @@ public class Eye implements Comparable<Eye> {
      * @param eye
      * @return
      */
-    @Override
-    public int compareTo(Eye eye) {
+    public int distanceTo(Eye eye) {
         double r_diff = this.getColor().getRed() - eye.getColor().getRed();
         double g_diff = this.getColor().getGreen() - eye.getColor().getGreen();
         double b_diff = this.getColor().getBlue() - eye.getColor().getBlue();
index e97ff8199f5410e6cdf522805e6849d4fa1a2b8f..f5b543ea5d88f159ab64cfa95406f444c0ca274f 100644 (file)
@@ -1,4 +1,4 @@
-public class Firstname implements Comparable<Firstname> {
+public class Firstname {
     private String firstname;
 
     Firstname() {
@@ -16,8 +16,7 @@ public class Firstname implements Comparable<Firstname> {
         this.firstname = firstname;
     }
 
-    @Override
-    public int compareTo(Firstname firstname) {
-        return LevenshteinDistance.computeLevenshteinDistance(this.getFirstname(), firstname.getFirstname());
+    public int distanceTo(Firstname firstname) {
+        return Utils.computeLevenshteinDistance(this.getFirstname(), firstname.getFirstname());
     }
 }
\ No newline at end of file
index 221d09c15b67fcdcb2e507412a40b98ec0b26aa6..f7714fdedc3d30c35b4b4292de8bb055c0b23c75 100644 (file)
@@ -20,7 +20,7 @@ public class Main {
         personArrayList.add(person6);
         Person person7 = new Person("Bob", "United States of America", 162, 75, "green");
         personArrayList.add(person7);
-        Person person8 = new Person("Jonh", "United Kingdom", 176, 102, "brown");
+        Person person8 = new Person("John", "United Kingdom", 176, 102, "brown");
         personArrayList.add(person8);
         Person person9 = new Person("Kithe", "Germany", 166, 69, "black");
         personArrayList.add(person9);
@@ -36,9 +36,9 @@ public class Main {
         personArrayList.add(person14);
         Person person15 = new Person("Abdel", "Mali", 168, 52, "black");
         personArrayList.add(person15);
-        Person person16 = new Person("Sherrazade", "Mali", 148, 48, "black");
+        Person person16 = new Person("Shéhérazade", "Mali", 148, 48, "black");
         personArrayList.add(person16);
-        Person person17 = new Person("Aifa", "Mali", 149, 49, "black");
+        Person person17 = new Person("Aïfa", "Mali", 149, 49, "black");
         personArrayList.add(person17);
         Person person18 = new Person("Roberto", "Brasil", 168, 56, "brown");
         personArrayList.add(person18);
@@ -64,9 +64,9 @@ public class Main {
         personArrayList.add(person28);
         Person person29 = new Person("Ange", "France", 175, 62, "green");
         personArrayList.add(person29);
-        Person person30 = new Person("Aurelie", "France", 163, 59, "green");
+        Person person30 = new Person("Aurélie", "France", 163, 59, "green");
         personArrayList.add(person30);
-        Person person31 = new Person("Audrey", "United Kingdom", 163, 69, "blue");
+        Person person31 = new Person("Audrey", "United Kingdom", 169, 69, "green");
         personArrayList.add(person31);
         Person person32 = new Person("Anthony", "United Kingdom", 176, 69, "black");
         personArrayList.add(person32);
@@ -74,8 +74,7 @@ public class Main {
         personArrayList.add(person33);
 
         Person emptyPerson = new Person();
-        emptyPerson.setPersonArrayList(personArrayList);
-        PersonView emptyPersonView = new PersonView(emptyPerson);
+        PersonView emptyPersonView = new PersonView(emptyPerson, personArrayList);
 
         //Schedule a job for the event-dispatching thread:
         //creating and showing this application's GUI.
index 7d3e855c30ca7cb28690d408ffb61df29bde6ce9..c02dd28a1f4b777de433777a5e5452b8a6702f31 100644 (file)
@@ -1,7 +1,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 
-public class Origin implements Comparable<Origin> {
+public class Origin {
     private String continent = "Unknown";
     private String country;
     private String[] continents = {"Africa", "Americas", "Asia", "Europe", "Oceania"};
@@ -9,7 +9,7 @@ public class Origin implements Comparable<Origin> {
             {"Mali"}, /* Africa */
             {"United States of America", "Brasil", "Mexico"}, /* Americas */
             {"India"}, /* Asia */
-            {"France", "Germany", "United Kingdom", "Belgium", "Norway"}, /* Europe */
+            {"France", "Italie", "Germany", "United Kingdom", "Belgium", "Norway"}, /* Europe */
             {"Australia"} /* Oceania */
     };
 
@@ -62,8 +62,7 @@ public class Origin implements Comparable<Origin> {
             return "Unknown";
     }
 
-    @Override
-    public int compareTo(Origin origin) {
+    public int distanceTo(Origin origin) {
         return 0;
     }
 }
index 4eabb1b9b651a662d6994799bbab666b78cae90f..5d9d812924ec1daf2c66351c4f90272a397e7bce 100644 (file)
@@ -1,15 +1,12 @@
-import java.util.ArrayList;
 import java.util.Comparator;
-import java.util.ListIterator;
 
-public class Person implements Comparable<Person>, Comparator<Person> {
+public class Person implements Comparator<Person> {
     private Firstname firstname;
     private Origin origin;
     private Size size;
     private Weight weight;
     private Eye eye;
-    //List of persons in the database to compare to.
-    private ArrayList<Person> personArrayList;
+    private Integer distanceFromReference;
 
     Person() {
         setFirstname(new Firstname());
@@ -17,7 +14,7 @@ public class Person implements Comparable<Person>, Comparator<Person> {
         setPersonSize(new Size());
         setWeight(new Weight());
         setEye(new Eye());
-        setPersonArrayList(new ArrayList<>());
+        setDistanceFromReference(0);
     }
 
     Person(String firstname, String country, Integer size, Integer weight, String colorEye) {
@@ -26,7 +23,7 @@ public class Person implements Comparable<Person>, Comparator<Person> {
         setPersonSize(new Size(size));
         setWeight(new Weight(weight));
         setEye(new Eye(colorEye));
-        setPersonArrayList(new ArrayList<>());
+        setDistanceFromReference(0);
     }
 
     public void setFirstname(Firstname firstname) {
@@ -69,25 +66,12 @@ public class Person implements Comparable<Person>, Comparator<Person> {
         return eye;
     }
 
-    public void setPersonArrayList(ArrayList<Person> personArrayList) {
-        this.personArrayList = personArrayList;
+    public void setDistanceFromReference(Integer distanceFromReference) {
+        this.distanceFromReference = distanceFromReference;
     }
 
-    public ArrayList<Person> getPersonArrayList() {
-        return personArrayList;
-    }
-
-    public void displayArrayList(ArrayList arrayList) {
-        ListIterator iter = arrayList.listIterator();
-        Integer i = 0;
-        while (iter.hasNext()) {
-            System.out.println(i.toString() + " " + iter.next());
-            i++;
-        }
-    }
-
-    public void displayPersonArrayList() {
-        this.displayArrayList(this.personArrayList);
+    public Integer getDistanceFromReference() {
+        return distanceFromReference;
     }
 
     @Override
@@ -98,18 +82,18 @@ public class Person implements Comparable<Person>, Comparator<Person> {
                 ", size=" + size.getSize() +
                 ", weight=" + weight.getWeight() +
                 ", eye=" + eye.getStrColor() + "(" + this.getEye().getColor().getRed() + "," + this.getEye().getColor().getGreen() + "," + this.getEye().getColor().getBlue() + ")" +
+                ", distanceFromReference=" + this.getDistanceFromReference() +
                 '}';
     }
 
-    @Override
-    public int compareTo(Person person) {
-        return this.firstname.compareTo(person.getFirstname()) + this.origin.compareTo(person.getOrigin())
-                + this.size.compareTo(person.getPersonSize()) + this.weight.compareTo(person.getWeight())
-                + this.eye.compareTo(person.getEye());
+    public Integer distanceTo(Person person) {
+        return this.getFirstname().distanceTo(person.getFirstname()) + this.getOrigin().distanceTo(person.getOrigin())
+                + this.getPersonSize().distanceTo(person.getPersonSize()) + this.getWeight().distanceTo(person.getWeight())
+                + this.getEye().distanceTo(person.getEye());
     }
 
     @Override
     public int compare(Person p1, Person p2) {
-        return p1.compareTo(p2);
+        return p1.getDistanceFromReference().compareTo(p2.getDistanceFromReference());
     }
 }
index a98c1e7d89796ce7d1078d0b1c202252b261a104..8cee3e23e100c5ed70d01dd669f78c294693b0da 100644 (file)
@@ -8,6 +8,7 @@ public class PersonView extends JPanel implements ActionListener {
     private int width = 400;
     private int height = 600;
     private Person personObj;
+    private ArrayList<Person> personArrayList;
     private FirstnameView firstnameView;
     private OriginView originView;
     private SizeView sizeView;
@@ -18,13 +19,14 @@ public class PersonView extends JPanel implements ActionListener {
     /*private ImageIcon originImage;
     private ImageIcon personImage;*/
 
-    PersonView(Person personObj) {
+    PersonView(Person personObj, ArrayList<Person> personArrayList) {
         setPersonObj(personObj);
         setFirstnameView(new FirstnameView(15, this.personObj.getFirstname()));
         setOriginView(new OriginView(this.personObj.getOrigin()));
         setSizeView(new SizeView(this.personObj.getPersonSize()));
         setWeightView(new WeightView(this.personObj.getWeight()));
         setEyeView(new EyeView(this.personObj.getEye()));
+        setPersonArrayList(personArrayList);
 
         this.compareButton.addActionListener(this);
         JLabel personLabel = new JLabel("Closest person found");
@@ -104,6 +106,13 @@ public class PersonView extends JPanel implements ActionListener {
         this.weightView = weightView;
     }
 
+    /**
+     * @return
+     */
+    public EyeView getEyeView() {
+        return eyeView;
+    }
+
     /**
      * @param eyeView
      */
@@ -111,11 +120,12 @@ public class PersonView extends JPanel implements ActionListener {
         this.eyeView = eyeView;
     }
 
-    /**
-     * @return
-     */
-    public EyeView getEyeView() {
-        return eyeView;
+    public ArrayList<Person> getPersonArrayList() {
+        return personArrayList;
+    }
+
+    public void setPersonArrayList(ArrayList<Person> personArrayList) {
+        this.personArrayList = personArrayList;
     }
 
     @Override
@@ -139,18 +149,15 @@ public class PersonView extends JPanel implements ActionListener {
             this.getPersonObj().setPersonSize(new Size(size));
             this.getPersonObj().setWeight(new Weight(weight));
             this.getPersonObj().setEye(new Eye(eye_color));
-            //this.getPersonObj().displayPersonArrayList();
-            ArrayList<Person> personArrayList = this.getPersonObj().getPersonArrayList();
-            personArrayList.add(this.getPersonObj());
-            this.getPersonObj().displayArrayList(personArrayList);
+            ArrayList<Person> personArrayList = this.getPersonArrayList();
+            //Utils.displayArrayList(personArrayList);
+            Utils.computeDistanceFrom(getPersonObj(), personArrayList);
             personArrayList.sort(getPersonObj());
-            this.getPersonObj().displayArrayList(personArrayList);
-            Integer previousPersonIndex = personArrayList.indexOf(this.getPersonObj()) - 1;
-            Integer nextPersonIndex = personArrayList.indexOf(this.getPersonObj()) + 1;
-            //Person previousPerson = personArrayList.get(personArrayList.indexOf(this.getPersonObj()) - 1);
-            //Person nextPerson = personArrayList.get(personArrayList.indexOf(this.getPersonObj()) + 1);
-            System.out.println(previousPersonIndex);
-            System.out.println(nextPersonIndex);
+            //Utils.displayArrayList(personArrayList);
+            Person closestPerson = personArrayList.get(personArrayList.indexOf(this.getPersonObj()) + 1);
+            JLabel closestPersonLabel = new JLabel();
+            closestPersonLabel.setText(closestPerson.toString());
+            this.personPanel.add(closestPersonLabel);
         }
     }
 }
index a61f24cb79769b34c3a8e8b502542621232a81ed..eb8003f542104a9249658a2b118a8f758c0f8814 100644 (file)
@@ -1,6 +1,7 @@
-public class Size implements Comparable<Size> {
+public class Size {
     private int max = 240;
     private int min = 40;
+    private int defaultSize = 160;
     private int size;
 
     Size() {
@@ -18,6 +19,10 @@ public class Size implements Comparable<Size> {
         return max;
     }
 
+    public int getDefaultSize() {
+        return defaultSize;
+    }
+
     public int getSize() {
         return size;
     }
@@ -34,13 +39,8 @@ public class Size implements Comparable<Size> {
         return (size >= getMin() && size <= getMax());
     }
 
-    @Override
-    public int compareTo(Size size) {
+    public int distanceTo(Size size) {
         int distance = size.getSize() - this.getSize();
-        if (distance >= 0)
-            return distance;
-        else
-            return -distance;
-
+        return Math.abs(distance);
     }
 }
index bdb2c7e8fa2bd6dbe5889fc6eda1ca54c1b14647..fd17e7af4ba7e9aa9b08099dd9536ef8129fc789 100644 (file)
@@ -9,7 +9,7 @@ public class SizeView extends JPanel {
         setSizeObj(sizeObj);
         this.label = new JLabel();
         this.label.setText("Size (meters)");
-        SpinnerNumberModel numberModel = new SpinnerNumberModel((this.getSizeObj().getMax() - this.getSizeObj().getMin()) / 2,
+        SpinnerNumberModel numberModel = new SpinnerNumberModel(this.getSizeObj().getDefaultSize(),
                 this.getSizeObj().getMin(),
                 this.getSizeObj().getMax(),
                 1);
similarity index 54%
rename from src/LevenshteinDistance.java
rename to src/Utils.java
index 3706772f01de3bfeef93f0fd1abd6ff3f6d48773..b551cb1bb2f4541f98abb5e28d478e3ce617185d 100644 (file)
@@ -1,5 +1,26 @@
+import java.util.ArrayList;
+import java.util.ListIterator;
+
+public class Utils {
+    public static void displayArrayList(ArrayList arrayList) {
+        ListIterator iter = arrayList.listIterator();
+        Integer i = 0;
+        while (iter.hasNext()) {
+            System.out.println(i.toString() + " " + iter.next());
+            i++;
+        }
+    }
+
+    public static void computeDistanceFrom(Person personFrom, ArrayList<Person> personArrayList) {
+        if (!personArrayList.contains(personFrom))
+            personArrayList.add(personFrom);
+        ListIterator<Person> iter = personArrayList.listIterator();
+        while (iter.hasNext()) {
+            Person personCursor = iter.next();
+            personCursor.setDistanceFromReference(personFrom.distanceTo(personCursor));
+        }
+    }
 
-public class LevenshteinDistance {
     /**
      * @param a
      * @param b
index 4b67611af0eef2f07bfa7437e498d9418298af7c..82fa712ce3f75a78b36ce2b2d185eae46b844745 100644 (file)
@@ -1,4 +1,4 @@
-public class Weight implements Comparable<Weight> {
+public class Weight {
     private int min = 2;
     private int max = 600;
     private int defaultWeight = 72;
@@ -48,12 +48,8 @@ public class Weight implements Comparable<Weight> {
         return intArray;
     }
 
-    @Override
-    public int compareTo(Weight weight) {
+    public int distanceTo(Weight weight) {
         int distance = weight.getWeight() - this.getWeight();
-        if (distance >= 0)
-            return distance;
-        else
-            return -distance;
+        return Math.abs(distance);
     }
 }