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

时间:2018-08-24 17:31:15

标签: java arrays list

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

例如:[US,CN,IN,EN,FR,GR,PL,MX]

,期望列表的顺序应始终与上面的列表相同。

但要注意的是,我用来比较的列表有时没有上述任何国家/地区代码...

例如我要比较的列表是[US,CN,EN,GR,PL,MX]

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

如果列表类似于[CN,US,EN,GR,PL,MX],则应该失败,因为CN在美国之前。

列表是否具有所有值都没有关系,即使我们跳过某些国家/地区代码,如果其他国家/地区代码的顺序正确也应该通过

请让我知道最好的方法是什么?

3 个答案:

答案 0 :(得分:1)

我们可以将要检查的列表的每个元素映射到“订单”(第一)列表中的相应索引(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的两个连续元素相同时(如果逻辑另有说明,请更改为>),以上内容被视为“有序”。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

以下是使用TestNg Assert的另一种解决方案:

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;
}