Java 比较两个列表

问题描述 投票:0回答:12

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

例如

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

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

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

请帮忙

P.S:这不是学校作业:)所以如果你指导我就足够了

java list comparison hashmap
12个回答
180
投票

编辑

这里有两个版本。一个使用

ArrayList
,另一个使用
HashSet

比较它们并据此创建您的自己的版本,直到获得您需要的内容。

这应该足以涵盖:

P.S:这不是学校作业:)所以如果你指导我就足够了

您问题的一部分。

继续原来的答案:

您可以使用

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]

如果它不能完全满足您的需要,它会给您一个良好的开始,以便您可以从这里开始处理。

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


45
投票

您可以尝试

intersection()
中的
subtract()
CollectionUtils
方法。

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

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


17
投票

如果您正在寻找一种方便的方法来测试两个集合的相等性,您可以使用

org.apache.commons.collections.CollectionUtils.isEqualCollection
,它会比较两个集合,无论顺序如何。


16
投票

在所有方法中,我发现使用

org.apache.commons.collections.CollectionUtils#isEqualCollection
是最好的方法。原因如下 -

  • 我不必自己声明任何额外的列表/设置
  • 我不会改变输入列表
  • 效率非常高。它检查 O(N) 复杂度的相等性。

如果不可能将

apache.commons.collections
作为依赖项,我建议实现它所遵循的算法来检查列表的相等性,因为它的效率很高。


11
投票

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

因为如果是后者,那么您可以使用

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]"

7
投票

使用 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();
}

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

输出:-

similiar [b, c]
different [f]

1
投票

假设

hash1
hash2

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.

1
投票

我在List Compare找到了一个非常基本的列表比较示例 此示例首先验证大小,然后检查一个列表中的特定元素在另一个列表中的可用性。


0
投票
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));
  }

0
投票
protected <T> boolean equals(List<T> list1, List<T> list2) {
  
        if (list1 == list2) {
            return true;
        }
 
        if (list1 == null || list2 == null || list1.size() != list2.size()) {
            return false;
        }
       // to prevent wrong results on {a,a,a} and {a,b,c} 
       // iterate over list1 and then list2
        return list1.stream()
                .filter(val -> !list2.contains(val))
                .collect(Collectors.toList())
                .isEmpty()  &&
               list2.stream()
                .filter(val -> !list1.contains(val))
                .collect(Collectors.toList())
                .isEmpty();
    }

0
投票
private boolean isEquales(List<String> list1, final List<String> list2) {

    if(list1.size() == list2.size()) {

        Collections.sort(list1);
        Collections.sort(list2);

        for(int i=0; i<list1.size(); i++)
            if(!list1.get(i).equals(list2.get(i))) 
                return false;

        return true;

    }else
        return false;
}
© www.soinside.com 2019 - 2024. All rights reserved.