我是java的新手,我有两个List<String>
。当我这样做时:
list1.equals(list2)
正在给我false
。虽然列表是相同的。
检查平等是否正确?
答案 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