Java比较两个列表

我有两个列表(不是java列表,你可以说两列)

例如

**List 1** **Lists 2** milan hafil dingo iga iga dingo elpha binga hafil mike meat dingo milan elpha meat iga neeta.peeta 

我想要一个返回有多less元素相同的方法。 对于这个例子,它应该是3,它也应该返回我列表和不同值的类似值。

我应该使用hashmap如果是,那么有什么方法来得到我的结果?

请帮忙

PS:这不是一个任务:)所以,如果你只是引导我,这将是足够的

编辑

这里有两个版本。 一个使用ArrayList和其他使用HashSet

比较他们,并从中创build自己的版本,直到你得到你所需要的。

这应该足以覆盖:

PS:这不是一个任务:)所以,如果你只是引导我,这将是足够的

你的问题的一部分。

继续原来的答案:

你可以使用java.util.Collection和/或java.util.ArrayList

retainAll方法执行以下操作:

只保留包含在指定集合中的集合中的元素

看到这个例子:

 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 ); } } 

编辑

对于第二部分(类似的值),你可以使用removeAll方法:

删除指定集合中也包含的所有此集合的元素。

这第二个版本也给你类似的值和处理重复(通过丢弃它们)。

这次Collection可以是Set而不是List (不同之处在于Set不允许重复的值)

 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); } } 

输出:

 $ java Repeated One:[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] 

如果它不能满足你的需求,那么你就可以从这里开始。

读者的问题:你将如何包含所有重复的值?

您可以尝试从CollectionUtils intersection()subtract()方法。

intersection()方法为您提供了一个包含常用元素的集合,而subtract()方法为您提供了所有不常见的元素。

他们也应该照顾类似的元素

这些是真正的列表 (有重复的),还是集合 (无序,没有重复)?

因为如果是后者,那么可以使用java.util.HashSet<E> ,并使用便捷的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]" 

使用java 8 removeIf

 public int getSimilarItems(){ List<String> one = Arrays.asList("milan", "dingo", "elpha", "hafil", "meat", "iga", "neeta.peeta"); List<String> two = new ArrayList<>(Arrays.asList("hafil", "iga", "binga", "mike", "dingo")); //Cannot remove directly from array backed collection int initial = two.size(); two.removeIf(one::contains); return initial - two.size(); } 

假设hash1hash2

 List< String > sames = whatever List< String > diffs = whatever int count = 0; for( String key : hash1.keySet() ) { if( hash2.containsKey( key ) ) { sames.add( key ); } else { diffs.add( key ); } } //sames.size() contains the number of similar elements. 

我发现列表比较的一个非常基本的例子列表比较这个例子首先validation大小,然后检查另一个列表的特定元素的可用性。

 public static boolean compareList(List ls1, List ls2){ return ls1.containsAll(ls2) && ls1.size() == ls2.size() ? true :false; } public static void main(String[] args) { ArrayList<String> one = new ArrayList<String>(); one.add("one"); one.add("two"); one.add("six"); ArrayList<String> two = new ArrayList<String>(); two.add("one"); two.add("six"); two.add("two"); System.out.println("Output1 :: " + compareList(one, two)); two.add("ten"); System.out.println("Output2 :: " + compareList(one, two)); }