【问题标题】:How to compare two List String? [duplicate]如何比较两个列表字符串? [复制]
【发布时间】:2014-02-21 09:57:00
【问题描述】:

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

list1.equals(list2)

给我false。尽管列表相同。

这是检查相等性的正确方法吗?

【问题讨论】:

  • 我们必须知道你对equals的定义
  • 包含可以让我们重现您的问题的代码。否则我们只需要猜测可能出错的地方,这意味着很多猜测。
  • 请发布示例输入和输出。
  • String.equals() 方法,List<String> 用来检查相等性的方法是明确定义的,所以 -if 它们的顺序相同 - 比较需要产生true

标签: java


【解决方案1】:

您可以使用 Apache 的 ListUtils 中的 isEqualList

isEqualList

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

根据中的平等契约测试两个列表的价值平等 List.equals(java.lang.Object)。

当您无法扩展时,此方法对于实现 List 很有用 抽象列表。该方法采用 Collection 实例来启用其他 集合类型使用 List 实现算法。

相关文本(稍微解释一下,因为这是一个静态方法) 是:

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

【讨论】:

  • 在这种特定情况下,我看不出这对 List#equals 有何帮助...
  • 同意@assylias,我看不出标准实现有什么问题。
【解决方案2】:

这是正确的方法。您的清单并不像您所说的那样平等。尝试打印它们以进行目视检查。

【讨论】:

【解决方案3】:

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

对于忽略顺序的比较,您可以比较两个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

【讨论】:

    猜你喜欢
    • 2019-09-08
    • 1970-01-01
    • 2017-11-19
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    • 2019-05-19
    • 2017-10-28
    • 1970-01-01
    相关资源
    最近更新 更多