我想比较两个以任意顺序包含相同元素的
List<List<String>>
。他们不平等。
// 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));
您可以尝试使用Apache Commons
public static boolean isEqualCollection(集合a,集合b)
当给定集合包含具有完全相同基数的完全相同元素时返回 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));
}
}
方法
.containsAll()
适用于集合,不适用于集合的集合。
基本上我最终比较了第一个集合的每个元素,然后使用
.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)));
}
}
注意:两者外部列表的顺序是相同的。不然不行。
以任意顺序比较两个
List<List<String>>
以及内部列表中的任意顺序(缺少或重复的元素除外),基本上是为了比较它们的字谜词:
List<List<String>> actual = List<List<String>> expected = List.of(
List.of("bat"),
List.of("tea", "ate", "eat"),
List.of("tan", "nat")
);
List<List<String>> expected = List.of(
List.of("nat", "tan"),
List.of("bat"),
List.of("ate", "eat", "tea")
);
Set<Integer> actualHash = new HashSet<>();
Set<Integer> expectedHash = new HashSet<>();
for (int i = 0; i < actual.size(); i++) {
actualHash.add(new HashSet<>(actual.get(i)).hashCode());
expectedHash.add(new HashSet<>(expected.get(i)).hashCode());
}
Assertions.assertThat(actualHash.hashCode()).hasSameHashCodeAs(expectedHash.hashCode());
我在这里使用了
org.assertj.core.api.Assertions
,但它可以是任何断言。