6

我有两个List<String[]>(字符串数组列表),我想将内容相互匹配。显然==没有做到这一点,但.equals ()似乎也没有做到。那么如何检查字符串数组列表的内容是否相同呢?

顺便说一句,在上述两种情况下,我都遇到了 message 异常null

编辑:好的......由于某种原因只能x.equals(y)工作,而不是y.equals(x). 奇怪的...

4

5 回答 5

5

也许最简单的解决方案是使用两个List<List<String>>s。假设List使用的实现 extend AbstractList, usingequals会给你想要的行为。从文档中AbstractList.equals

比较指定对象与此列表是否相等。true当且仅当指定对象也是一个列表时返回 ,两个列表具有相同的大小,并且两个列表中所有对应的元素对都相等。(如果 ,则两个元素e1e2相等(e1==null ? e2==null : e1.equals(e2))。)换句话说,如果两个列表以相同的顺序包含相同的元素,则它们被定义为相等。

您可以轻松地将 a 包装在一个通过使用扩展String[]的瘦List<String>实现中。AbstractListArrays.asList

编辑:这是一个例子:

String[] array1 = {"1", "2", "3"};
String[] array2 = {"4", "7"};

String[] array3 = {"1", "2", "3"};
String[] array4 = {"4", "7"};

List<List<String>> lst1 = new ArrayList<>();
lst1.add(Arrays.asList(array1));
lst1.add(Arrays.asList(array2));

List<List<String>> lst2 = new ArrayList<>();
lst2.add(Arrays.asList(array3));
lst2.add(Arrays.asList(array4));

System.out.println(lst1.equals(lst2)); //prints true
于 2012-09-07T18:35:27.907 回答
3

通常你应该避免处理数组。它们很丑陋并导致这些问题。如果可能使用List<List<String>>,那么您可以.equals()正常使用。

如果您坚持,您可以使用如下的自定义 isequal 实现。关键是使用Arrays.equals()

public class DemoEquals {
    List<String[]> listOne = (List<String[]>) Arrays.asList(new String[]{"one1", "one2"}, new String[]{"two1"});
    List<String[]> listOneOne = (List<String[]>) Arrays.asList(new String[]{"one1", "one2"}, new String[]{"two1"});
    List<String[]> listTwo = (List<String[]>) Arrays.asList(new String[]{"2one1", "2one2"}, new String[]{"2two1"});

    private boolean isEqual(List<String[]> list1, List<String[]> list2) {
        if (list1.size() != list2.size()) return false;
        for (int i = 0; i < list1.size(); i++) {
            if (!Arrays.equals(list1.get(i), list2.get(i))) return false;
        }
        return true;
    }
    @SuppressWarnings("unchecked")
    private void isEqual() {
        //prints true
        System.out.println(isEqual(Collections.EMPTY_LIST, Collections.EMPTY_LIST));
        //prints true
        System.out.println(isEqual(listOne, listOne));
        //prints true
        System.out.println(isEqual(listOne, listOneOne));
        //prints false
        System.out.println(isEqual(listOne, listTwo));
        //prints false
        System.out.println(isEqual(listOne, Collections.EMPTY_LIST));

    }
    public static void main(String[] args) {
        new DemoEquals().isEqual();
    }
}
于 2012-09-07T18:36:19.193 回答
0

您可以使用 INTERFACE Comparable。实现所需的方法,您可以使用 List1.compare(List2) 函数。

于 2012-09-07T18:39:36.947 回答
0

只是.equals()工作正常,但不知何故只在一个方向。

我打算接受这个问题的第一个答案,但显然那个人删除了他的答案。

于 2012-09-09T10:24:50.620 回答
-1

使用 Jon Skeet 关于如何将列表转换为字符串(使用番石榴)的答案,另一种选择是将 2 个列表转换为 2 个字符串,然后使用equals. 没有循环。

于 2012-09-07T18:39:53.527 回答