【问题标题】:Compare List<String[]>比较列表<String[]>
【发布时间】:2012-09-01 15:30:16
【问题描述】:

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

顺便说一句,在上述两种情况下,我都收到了消息null 的异常。

编辑:好的...由于某种原因,只有x.equals(y) 有效,y.equals(x) 无效。奇怪...

【问题讨论】:

  • 你能提供一个你尝试过的代码sn-p吗?
  • "我收到一条异常消息 null ...由于某种原因,只有 x.equals (y) 有效,而 不是 y.equals (x)。”我相信ynull,你有没有初始化它?
  • +Sam 我愿意,就在public class MainActivity extends Activity {之后。
  • 请发布相关代码,如果您收到 NullPointerExceptions,那么您是在定义而不是初始化。 (此外,您还需要在 SO 中使用 @username 而不是 +username 来通知特定用户。)
  • 你究竟在哪里得到一个空异常?也许您需要确保 y 在 y.equals(x) 之前不为空。例如 if(y!=null && y.equals(x) || y==null && x==null) { ...

标签: java android arrays list


【解决方案1】:

也许最简单的解决方案是使用两个List&lt;List&lt;String&gt;&gt;s。假设使用的List 实现扩展AbstractList,使用equals 将为您提供所需的行为。来自AbstractList.equals 的文档:

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

您可以轻松地将String[] 包装在一个瘦List&lt;String&gt; 实现中,该实现通过使用Arrays.asList 扩展AbstractList

编辑:这是一个例子:

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

【讨论】:

    【解决方案2】:

    通常你应该避免处理数组。它们很丑陋并导致这些问题。如果可以使用List&lt;List&lt;String&gt;&gt;,那么你可以正常使用.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();
        }
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        使用 Jon Skeet 对 how to convert a List to a String 的回答(使用 Guava),另一种选择是将 2 个列表转换为 2 个字符串,然后使用 equals 进行比较。没有循环。

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

          • 如果它在一个方向上工作它就不起作用。您在这里创建了一个稍后会困扰您的错误。 @Paul Bellora 和我的回答都很好地坚持其中一个
          猜你喜欢
          • 1970-01-01
          • 2014-04-25
          • 1970-01-01
          • 1970-01-01
          • 2011-12-11
          • 2012-03-17
          • 1970-01-01
          • 2010-09-09
          • 1970-01-01
          相关资源
          最近更新 更多