如何根据它包含的元素比较两个列表?

时间:2011-07-27 22:43:11

标签: java list collections compare

在我的单元测试课中,我有两个列表。一个是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]

6 个答案:

答案 0 :(得分:2)

使用equals()

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:1)

确保列表中的对象覆盖equals和hashcode方法,但除此之外,您可以根据java.util.List的合同直接比较列表,如果列表包含相同的对象,则表明它们相等。同样的订单。

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

答案 4 :(得分:0)

编辑:

最好的办法是

assertEquals(expected, returned);

因为AbstractList使用成对比较实现等于。 如果您不确定,您收到的列表是否从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));
    }
}

答案 5 :(得分:0)

尝试使用此:     CollectionUtils.isEqualCollection(期望,返回);