【问题标题】:How to compare two list based on elements it contains?如何根据包含的元素比较两个列表?
【发布时间】:2011-07-27 22:43:10
【问题描述】:

在我的单元测试课程中,我有两个列表。一个是expectedValue,另一个是returnedType

我在做

Collections.sort(expected);
Collections.sort(returned);

但是如何根据其中一个元素的值类型比较两个列表?例如,我在两个列表中都有元素 sortOrder 并且它具有来自 1,2 or 3 的值所以我如何比较或说做类似 assertEqual(expected, returned) for both the list 的事情并确保两个列表具有相同的元素并且具有相同的 sortOrder 含义元素也是以正确的排序格式?

注意:我不应该使用任何外部库来做这件事。

更新

我的退货和预期清单示例:

excepted List = [Code: ANALYST, SortOrder: 2, Code: STREET, SortOrder: 1]returned List = [Code: STREET, SortOrder: 1, Code: ANALYST, SortOrder: 2]

因此,这里非常基本的问题是如何根据其中一个元素值对列表进行排序,在我们的示例中,根据sortOrder 值,所以我们的预期应该是

excepted List = [Code: STREET, SortOrder: 1, Code: ANALYST, SortOrder: 2]

【问题讨论】:

  • 问题描述很不清楚。您不能根据其中一个元素的值对集合进行排序——对集合进行排序会对其包含的所有值进行排序。并且您可以使用 list1.equals(list2) 非常轻松地测试两个列表是否包含相同顺序的相同值。
  • @JimN:列表集合可以根据其中一个元素的值进行排序,这可以使用比较器来完成
  • 请解释一下你所说的“元素”和“价值”是什么意思。
  • 上面列表中的element指的是sortOrdervalues指的是sortOrder的值,即1、2和3

标签: java list collections compare


【解决方案1】:

看看Hamcrest - 用于构建测试表达式的匹配器库。

它提供了很多方法来比较集合(和其他难以比较的类)和特殊匹配器,这些匹配器可以告诉您为什么在抛出 AssertionErrors 时集合不匹配

【讨论】:

  • 有没有办法在不使用任何外部库的情况下做到这一点?
【解决方案2】:

使用equals()

【讨论】:

  • 那行不通。集合没有实现equals(),所以使用Object中的默认实现,它比较内存地址——即list1.equals(list2)list1 == list2相同,始终为false
  • AbstractList 确实覆盖了equals()AbstractSequentialList 扩展了 AbstractList,因此它也覆盖了 equals()。 Java 6 中List 的每个默认实现都会覆盖equals()
  • 哦 - 对不起(我是从臀部射击 - 我的错)。我会检查实现。干杯。
【解决方案3】:

要扩展 Bohemian 的回答 (+1),Hamcrest 是一个非常好的方法。这是一个例子:

assertThat(myListOfIntegers, contains(1, 2, 3));

Matchers.contains 断言列表元素是正确的类型、正确的数量和正确的顺序。因此,在上述断言中,我期望 myListOfIntegers 是确切的列表:[1, 2, 3]

【讨论】:

    【解决方案4】:

    确保列表中的对象覆盖 equals 和 hashcode 方法,否则您可以根据 java.util.List 的约定直接比较列表,如果列表包含相同的对象,则它们是相等的相同的顺序。

    http://download.oracle.com/javase/6/docs/api/java/util/List.html#equals(java.lang.Object)

    【讨论】:

      【解决方案5】:

      编辑:

      最好的办法就是这样做

      assertEquals(expected, returned);
      

      因为 AbstractList 使用成对比较来实现 equals。 如果您不确定,您收到的列表继承自 AbstractList,您可以随时进行

      assertEquals(new ArrayList(expected), new ArrayList(returned));
      

      我将其余答案留作记录目的(并且不掩饰我可耻的无知)

      您是否要断言列表的顺序也正确?

      public static void assertEquals(List expected, List returned)
      {
          assertEquals(expected.size(), returned.size());
          if(!expected.containsAll(returned))
          {
             fail();
          }
      
          for(int i = 0; i < expected.size(); i++)
          {
              assertEquals(expected.get(i),returned.get(i));
          }
      }
      

      【讨论】:

      • 是的。我需要断言两个列表具有相同的元素,并且两个列表的元素顺序相同
      • 我正在使用Junit测试框架,所以需要简单的断言方法
      • 我可以根据其中一个元素的值比较两个列表吗?
      • 从您更新的问题部分来看,您完全不清楚您要达到的目标。您的列表中有哪些元素?
      • 我的退货列表有 [Code: STREET, SortOrder: 1, Code: ANALYST, SortOrder: 2] 元素和例外列表 = [Code: ANALYST, SortOrder: 2, Code: STREET, SortOrder: 1 ]
      【解决方案6】:

      尝试使用这个: CollectionUtils.isEqualCollection(预期,返回);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-04
        • 2019-12-07
        • 2022-01-03
        • 2012-01-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多