我有一些字符串对象存储在列表中,
例如:[US,CN,IN,EN,FR,GR,PL,MX]
,期望列表的顺序应始终与上面的列表相同。
但要注意的是,我用来比较的列表有时没有上述任何国家/地区代码...
例如我要比较的列表是[US,CN,EN,GR,PL,MX]
但是它应该通过并返回true,因为它的顺序与第一个列表相同。
如果列表类似于[CN,US,EN,GR,PL,MX],则应该失败,因为CN在美国之前。
列表是否具有所有值都没有关系,即使我们跳过某些国家/地区代码,如果其他国家/地区代码的顺序正确也应该通过
请让我知道最好的方法是什么?
答案 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;
}