【问题标题】:Test List<List<T>> contains the same items in any order测试列表<List<T>> 包含任何顺序的相同项目
【发布时间】:2019-09-10 21:50:02
【问题描述】:

我想比较两个以任意顺序包含相同元素的List&lt;List&lt;String&gt;&gt;。它们不相等。

// expectedResult 
[
  ["ate","eat","tea"],
  ["nat","tan"],
  ["bat"]
]

另一个是

// result
[
  ["eat", "tea", "ate"], 
  ["bat"], 
  ["tan", "nat"]
]

我应该使用哪些测试方法(来自哪些库)来比较 **elements 中的元素而不进行排序?**

我试过这个没有成功。

import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;
import static org.junit.Assert.assertThat;

assertThat(expectedResult, containsInAnyOrder(result));

【问题讨论】:

标签: java junit hamcrest


【解决方案1】:

您可以尝试使用Apache Commons

public static boolean isEqualCollection(Collection a, Collection b)

如果给定的 Collections 包含完全相同的元素且具有完全相同的基数,则返回 true。

也就是说,对于 a 或 b 中的每个元素 e,如果 a 中的 e 的基数等于 b 中的 e 的基数。

参数:

  • a - 第一个集合,不能为空
  • b - 第二个集合,不能为空

返回:true 如果集合包含具有相同基数的相同元素。

import org.apache.commons.collections4.CollectionUtils;
import org.junit.Assert;
import org.junit.Test;

import java.util.Arrays;
import java.util.List;

public class TestSO {

    @Test
    public void testLists() {
        List<List<String>> list = Arrays.asList(Arrays.asList("ate", "eat", "tea"), Arrays.asList("nat", "tan"), Arrays.asList("bat"));
        List<List<String>> sameList = Arrays.asList(Arrays.asList("ate", "eat", "tea"), Arrays.asList("bat"), Arrays.asList("nat", "tan"));
        List<List<String>> differentList = Arrays.asList(Arrays.asList("ate", "eat"), Arrays.asList("bat"), Arrays.asList("nat", "tan"));

        Assert.assertTrue(CollectionUtils.isEqualCollection(list, sameList));
        Assert.assertFalse(CollectionUtils.isEqualCollection(list, differentList));
    }

}

【讨论】:

  • 谢谢。内部列表仍然是相同的顺序。尝试在 list 中重新订购 {"ate", "eat", "tea"} -> {"tea","ate", "eat"} ,你会发现一个错误
【解决方案2】:

.containsAll() 方法适用于 Collection 而不是 Collection 的 Collection。

基本上,我最终比较了第一个集合的每个元素,然后将.containsAll() 用于嵌套集合。

import org.junit.Assert;
import org.junit.Test;
import java.util.Arrays;
import java.util.List;

    @Test
    public void groupAnagramsTest() {
        List<List<String>> expectedResult = Arrays.asList(Arrays.asList("bat"), Arrays.asList("nat", "tan"), Arrays.asList("ate", "eat", "tea"));
        List<List<String>> result = Arrays.asList(Arrays.asList("bat"), Arrays.asList("tan", "nat"), Arrays.asList("tea", "eat", "ate"));

        // to test the equality without order, 
        // assert that all elements are contained in the compared list and vice versa
        for (int i = 0; i < result.size(); i++) {
            Assert.assertTrue(expectedResult.get(i).containsAll(result.get(i)));
            Assert.assertTrue(result.get(i).containsAll(expectedResult.get(i)));
        }
    }

注意:外部列表的顺序在两者之间是相同的。否则将无法正常工作。

【讨论】:

    猜你喜欢
    • 2011-09-09
    • 1970-01-01
    • 2012-08-23
    • 2012-09-11
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多