我正在自动化一个电子商务网站,在该网站中,我必须测试特定产品的下拉菜单中显示的尺寸是否按升序显示。
我声明了内容列表,该列表包含大小的升序
public static final List<String> T_SHIRT_SIZE_LIST = Collections.unmodifiableList(Arrays.asList("Small (S)", "Medium (M)", "Large (L)", "X-Large (XL)", "XX-Large (XXL)"));
现在,我已经将所有产品尺寸值存储在列表中,即
List<String> list2 = Arrays.asList("Small (S)", "Medium (M)", "Large (L)","XX-Large (XXL)");
我想比较list2的内容应该与T_SHIRT_SIZE_LIST
的顺序相同,即使list2中缺少一些值。
答案 0 :(得分:2)
相反,您可以使用比较器/可比较界面对列表进行排序。您不必比较两个列表,只需比较列表中的元素即可。
进行了编辑,以确保可以使用工厂方法将String转换为TShirtSize。
enum TShirtSize {
SMALL(0, "Small (S)"),
MEDIUM(1, "Medium (M)"),
LARGE(2, "Large (L)"),
XL(3, "X-Large (XL)"),
XXL(4, "XX-Large (XXL)");
private final int order;
private final String identifier;
TShirtSize(int order, String identifier) {
this.order = order;
this.identifier = identifier;
}
public static TShirtSize valueOfId(String id) {
// cache use of values() in an immutable map/set
return Stream.of(values()).filter(size -> size.identifier.equals(id)).findAny().orElseThrow(IllegalArgumentException::new);
}
public String getIdentifier() {
return identifier;
}
public int getOrder() {
return order;
}
}
public static boolean isOrdered(List<TShirtSize> sizes) {
List<TShirtSize> sizesOrdered = sizes.stream().sorted(Comparator.comparingInt(TShirtSize::getOrder)).collect(Collectors.toList());
return IntStream.range(0, sizes.size()).allMatch(index -> sizes.get(index) == sizesOrdered.get(index));
}
List<String> actualSize = Arrays.asList("Small (S)", "Large (L)", "X-Large (XL)");
List<TShirtSize> actualSizeList = actualSize.stream().map(TShirtSize::valueOfId).collect(Collectors.toList());
System.out.println("is expected : " + isOrdered(actualSizeList));
答案 1 :(得分:1)
您可以使用索引映射:
public static boolean isInOrder(List<String> input) {
List<Integer> indexes = input.stream()
.map(T_SHIRT_SIZE_LIST::indexOf).collect(Collectors.toList());
List<Integer> sorted = new ArrayList<>(indexes);
Collections.sort(sorted);
return sorted.equals(indexes);
}
(输入验证策略将取决于您的上下文)
答案 2 :(得分:0)
我认为使用Guava
Ordering
可以做到:
private static final Ordering T_SHIRT_SIZE_ORDERING = Ordering.explicit(T_SHIRT_SIZE_LIST);
...
T_SHIRT_SIZE_ORDERING.isOrdered(input);
但是要注意的是,如果input
的值不属于您的T_SHIRT_SIZE_LIST
,它将被吹灭。可以通过预先检查轻松缓解(并假设T_SHIRT_SIZE_SET
是等效于T_SHIRT_SIZE_LIST
的有序集合):
return T_SHIRT_SIZE_SET.containsAll(input) && T_SHIRT_SIZE_ORDERING.isOrdered(input);
另外请注意:如果您使用的是Java 9+,请使用List.of
进行一些输入:
public static final List<String> T_SHIRT_SIZE_LIST = List.of("Small (S)", "Medium (M)", "Large (L)", "X-Large (XL)", "XX-Large (XXL)");