有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

我在做什么

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

但是,如何根据其中一个元素的值类型来比较两个列表呢?例如,我在两个列表中都有元素sortOrder,它有来自1,2 or 3的值,那么我如何比较或说执行类似assertEqual(expected, returned) for both the list的操作,并确保这两个列表都有相同的元素和相同的排序器含义,以及元素也采用正确的排序格式

注意:我不应该使用任何外部库来执行此操作

更新

我的报税表和预期清单示例:

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) 个答案

  1. # 1 楼答案

    编辑:

    最好的方法就是

    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));
        }
    }
    
  2. # 2 楼答案

    试着用这个: 收藏品。isEqualCollection(预期、返回)

  3. # 4 楼答案

    要扩展波希米亚人的答案(+1),Hamcrest是一个非常好的方法。下面是一个例子:

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

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

  4. # 5 楼答案

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

    它提供了许多方法来比较集合(以及其他难以比较的类),并提供了特殊的匹配器,可以在抛出断言错误时告诉您集合不匹配的原因

  5. # 6 楼答案

    使用^{}