如何比较两个List String?

时间:2014-01-29 14:20:08

标签: java

我是java的新手,我有两个List<String>。当我这样做时:

list1.equals(list2)

正在给我false。虽然列表是相同的。

检查平等是否正确?

3 个答案:

答案 0 :(得分:1)

您可以使用Apache的isEqualList中的ListUtils

  

isEqualList

public static boolean isEqualList(java.util.Collection list1,
                                  java.util.Collection list2)
  

根据平等合同测试两个值相等的列表   List.equals(java.lang.Object中)。

     

当您无法扩展时,此方法对于实现List非常有用   AbstractList中。该方法采用Collection实例来启用其他实例   集合类型使用List实现算法。

     

相关文字(略带释义,因为这是一种静态方法)   是:

     

比较两个列表对象是否相等。当且仅返回true   如果两个列表具有相同的大小,并且所有对应的对   两个列表中的元素是相等的。 (两个元素e1和e2相等   if(e1 == null?e2 == null:e1.equals(e2))。)换句话说,两个列表   如果它们包含相同的元素,则被定义为相等   订购。此定义确保equals方法正常工作   跨接口的不同实现。注意:   如果在期间修改列表,则此方法的行为未定义   等于比较。

答案 1 :(得分:1)

这是正确的方法。您的清单与您说的不相同。尝试打印它们进行目视检查。

答案 2 :(得分:1)

要使两个列表相等,它们需要具有相同的顺序。我只能假设你在考虑相等时忽略了两个列表的顺序。

对于忽略顺序的比较,您可以比较两个Map<String, Integer>个实例(其中Integer是每个字符串的数量)。

例如:

public <T> boolean isEqualIgnoreOrder(List<T> l1, List<T> l2) {
   if (l1.size() != l2.size()) {
      return false;
   }
   Map<T, Integer> m1 = createMap(l1);
   Map<T, Integer> m2 = createMap(l2);
   return m1.equals(m2);
}

protected <T> Map<T, Integer> createMap(List<T> list) {
   Map<T, Integer> map = new HashMap<T, Integer>();
   for (T item : list) {
      Integer prevCount = map.get(item);
      map.put(prevCount == null ? 1 : prevCount + 1);
   }
   return map;
}

这种类型的收藏品被称为包。更多讨论here