Java比较两个列表

use*_*384 86 java comparison list hashmap

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

例如

**List 1**            **Lists 2**
  milan                 hafil
  dingo                 iga
  iga                   dingo
  elpha                 binga
  hafil                 mike
  meat                  dingo
  milan
  elpha
  meat
  iga                   
  neeta.peeta    
Run Code Online (Sandbox Code Playgroud)

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

如果是,我应该使用hashmap然后用什么方法来获取我的结果?

请帮忙

PS:这不是学校的任务:)所以如果你只是指导我就足够了

Osc*_*Ryz 154

编辑

这是两个版本.一个使用ArrayList和其他使用HashSet

比较它们并从中创建您自己的版本,直到您得到您需要的.

这应该足以涵盖:

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 );
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑

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

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

第二个版本还为您提供了类似的值和重复处理(通过丢弃它们).

这次Collection可能是a Set而不是a 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);
      }
}
Run Code Online (Sandbox Code Playgroud)

输出:

$ 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]
Run Code Online (Sandbox Code Playgroud)

如果它不能完全满足您的需求,它会给您一个良好的开端,因此您可以从这里开始处理.

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

  • @polygenelubricants回答更新以处理重复和原始类型.顺便说一下,*......未来版本的Java ......*永远不会发生.;) (2认同)

Mih*_*ria 34

你可以尝试intersection()subtract()方法CollectionUtils.

intersection()method为您提供了一个包含公共元素的集合,该subtract()方法为您提供了所有不常见的元素.

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

  • 应注意,此解决方案需要Apache Ccommons (3认同)

pol*_*nts 9

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

因为如果它是后者,那么你可以使用,比如说a 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]"
Run Code Online (Sandbox Code Playgroud)


sno*_*fox 8

如果您正在寻找一种方便的方法来测试两个集合的相等性,您可以使用org.apache.commons.collections.CollectionUtils.isEqualCollection,它会比较两个集合而不考虑排序。


Vij*_*pta 6

简单的解决方案:-

    List<String> list = new ArrayList<String>(Arrays.asList("a", "b", "d", "c"));
    List<String> list2 = new ArrayList<String>(Arrays.asList("b", "f", "c"));

    list.retainAll(list2);
    list2.removeAll(list);
    System.out.println("similiar " + list);
    System.out.println("different " + list2);
Run Code Online (Sandbox Code Playgroud)

输出 :-

similiar [b, c]
different [f]
Run Code Online (Sandbox Code Playgroud)


sha*_*wat 6

在所有方法中,我发现使用org.apache.commons.collections.CollectionUtils#isEqualCollection是最好的方法。原因如下——

  • 我不必自己声明任何其他列表/设置
  • 我没有改变输入列表
  • 这是非常有效的。它检查 O(N) 复杂度的相等性。

如果不可能apache.commons.collections作为依赖项,我会建议实施它遵循的算法来检查列表的相等性,因为它的效率。


Asa*_*ena 5

使用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();
}
Run Code Online (Sandbox Code Playgroud)