有没有一种方法可以以相同顺序比较另一个列表中的一个列表内容?

时间:2020-01-29 11:09:50

标签: java collections

我正在自动化一个电子商务网站,在该网站中,我必须测试特定产品的下拉菜单中显示的尺寸是否按升序显示。

我声明了内容列表,该列表包含大小的升序

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中缺少一些值。

3 个答案:

答案 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)");