簡體   English   中英

一個列表不穩定時如何比較兩個列表的順序

[英]how to compare order of two list when one list is not stable

我有一些字符串對象存儲在列表中,

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

並且期望列表的順序應始終與上面的列表相同。

但要注意的是,我用來比較的列表有時沒有上述任何國家/地區代碼...

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

但它應該通過並返回true,因為其順序與第一個列表相同。

如果列表是[CN,US,EN,GR,PL,MX],則該列表應該會失敗,因為CN在美國之前。

列表是否具有所有值並不重要,即使我們跳過某些國家/地區代碼,如果其他國家/地區代碼的順序正確也應該通過

請讓我知道最好的方法是什么?

我們可以將要檢查的列表的每個元素映射到“順序”(第一)列表中其對應的( 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兩個連續元素相同時(如果邏輯另有說明, list1改為> ),以上內容被視為“有序”。

您可以從列表中刪除所有項目以進行檢查,然后比較兩個列表:

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

這里是使用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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM