[英]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.