当一个列表不稳定时,如何比较两个列表的顺序



我有一些字符串对象存储在列表中,

例如:[美国、中国、印度、英文、法文、德国、波兰语、墨西哥]

并且预期列表的顺序应始终与上面的列表相同。

但问题是,我用来比较的列表有时没有上述任何国家代码......

例如,我正在比较的列表是[美国,中国,日本,gr,pl,墨西哥]

但它应该传递并返回 true,因为它与第一个列表的顺序相同。

如果列表像 [CN, US, EN, GR, PL, MX],它应该失败,因为 CN 先于美国。

列表是否包含所有值并不重要,即使我们跳过某个国家/地区代码,如果其他国家/地区代码的顺序正确,它也应该通过

请告诉我什么是最好的方法?

您可以从列表中删除所有要检查的项目,然后比较两个列表:

public static boolean check(String checkedAgainst, String items) {
List<String> checkedAgainstList = new ArrayList<>(Arrays.asList(checkedAgainst.split("\s*,\s*")));
List<String> list = Arrays.asList(items.split("\s*,\s*"));
checkedAgainstList.retainAll(list);
return checkedAgainstList.equals(list);
}

测试:

boolean valid = check("US, CN , IN, EN, FR, GR, PL, MX", "US, CN, EN, GR,PL, MX"); // true

我们可以将被检查的列表的每个元素映射到"order"(第一个(列表中的相应(indexOf(索引,然后检查每个这样的索引是否大于或等于它前面的索引。

没有小于其前面元素的索引列表可以认为排序正确。

列表:

List<String> order = Arrays.stream("US, CN , IN, EN, FR, GR, PL, MX".split(","))
.map(String::trim)
.collect(Collectors.toList());
List<String> list1 = Arrays.stream("US, CN, EN, GR,PL, MX".split(","))
.map(String::trim)
.collect(Collectors.toList());
List<String> list2 = Arrays.stream("CN, US, EN, GR, PL, MX".split(","))
.map(String::trim)
.collect(Collectors.toList());

检查顺序:

//range(1, list1.size()) assumes list1's size is at least 2.
boolean list1Ordered = IntStream.range(1, list1.size())
.allMatch(i -> order.indexOf(list1.get(i)) 
>= order.indexOf(list1.get(i - 1))); //returns true
boolean list2Ordered = IntStream.range(1, list2.size())
.allMatch(i -> order.indexOf(list2.get(i)) 
>= order.indexOf(list2.get(i - 1))); //returns false

请注意,当list1的两个连续元素相同时,上述内容认为"有序"(如果逻辑另有说明,则更改为>(。

这里有一个 TestNg 断言的解决方案:

List<String> baseList = Arrays.asList("US", "CN" , "IN", "EN", "FR", "GR", "PL", "MX");
List<String> newList = Arrays.asList("US", "CN" , "EN", "GR", "PL", "MX");
int index = baseList.indexOf(newList.get(0));
for (int i = 1; i < newList.size(); i++) {
int nextElementIndex = baseList.indexOf(newList.get(i));
Assert.assertTrue(nextElementIndex > index, "List order correct");
index = nextElementIndex;
}

最新更新