Java Compare Two Lists Java Compare Two Lists java java

Java Compare Two Lists


EDIT

Here are two versions. One using ArrayList and other using HashSet

Compare them and create your own version from this, until you get what you need.

This should be enough to cover the:

P.S: It is not a school assignment :) So if you just guide me it will be enough

part of your question.

continuing with the original answer:

You may use a java.util.Collection and/or java.util.ArrayList for that.

The retainAll method does the following:

Retains only the elements in this collection that are contained in the specified collection

see this sample:

import java.util.Collection;import java.util.ArrayList;import java.util.Arrays;public class Repeated {    public static void main( String  [] args ) {        Collection listOne = new ArrayList(Arrays.asList("milan","dingo", "elpha", "hafil", "meat", "iga", "neeta.peeta"));        Collection listTwo = new ArrayList(Arrays.asList("hafil", "iga", "binga", "mike", "dingo"));        listOne.retainAll( listTwo );        System.out.println( listOne );    }}

EDIT

For the second part ( similar values ) you may use the removeAll method:

Removes all of this collection's elements that are also contained in the specified collection.

This second version gives you also the similar values and handles repeated ( by discarding them).

This time the Collection could be a Set instead of a List ( the difference is, the Set doesn't allow repeated values )

import java.util.Collection;import java.util.HashSet;import java.util.Arrays;class Repeated {      public static void main( String  [] args ) {          Collection<String> listOne = Arrays.asList("milan","iga",                                                    "dingo","iga",                                                    "elpha","iga",                                                    "hafil","iga",                                                    "meat","iga",                                                     "neeta.peeta","iga");          Collection<String> listTwo = Arrays.asList("hafil",                                                     "iga",                                                     "binga",                                                      "mike",                                                      "dingo","dingo","dingo");          Collection<String> similar = new HashSet<String>( listOne );          Collection<String> different = new HashSet<String>();          different.addAll( listOne );          different.addAll( listTwo );          similar.retainAll( listTwo );          different.removeAll( similar );          System.out.printf("One:%s%nTwo:%s%nSimilar:%s%nDifferent:%s%n", listOne, listTwo, similar, different);      }}

Output:

$ java RepeatedOne:[milan, iga, dingo, iga, elpha, iga, hafil, iga, meat, iga, neeta.peeta, iga]Two:[hafil, iga, binga, mike, dingo, dingo, dingo]Similar:[dingo, iga, hafil]Different:[mike, binga, milan, meat, elpha, neeta.peeta]

If it doesn't do exactly what you need, it gives you a good start so you can handle from here.

Question for the reader: How would you include all the repeated values?


You can try intersection() and subtract() methods from CollectionUtils.

intersection() method gives you a collection containing common elements and the subtract() method gives you all the uncommon ones.

They should also take care of similar elements


Are these really lists (ordered, with duplicates), or are they sets (unordered, no duplicates)?

Because if it's the latter, then you can use, say, a java.util.HashSet<E> and do this in expected linear time using the convenient retainAll.

    List<String> list1 = Arrays.asList(        "milan", "milan", "iga", "dingo", "milan"    );    List<String> list2 = Arrays.asList(        "hafil", "milan", "dingo", "meat"    );    // intersection as set    Set<String> intersect = new HashSet<String>(list1);    intersect.retainAll(list2);    System.out.println(intersect.size()); // prints "2"    System.out.println(intersect); // prints "[milan, dingo]"    // intersection/union as list    List<String> intersectList = new ArrayList<String>();    intersectList.addAll(list1);    intersectList.addAll(list2);    intersectList.retainAll(intersect);    System.out.println(intersectList);    // prints "[milan, milan, dingo, milan, milan, dingo]"    // original lists are structurally unmodified    System.out.println(list1); // prints "[milan, milan, iga, dingo, milan]"    System.out.println(list2); // prints "[hafil, milan, dingo, meat]"