如何将一个数组列表的多个项目与特定位置的另一个数组列表进行比较?

时间:2018-12-07 05:40:37

标签: java arraylist collections

背景:有一个产品列表页面,我必须获取所有产品名称(包括缺货的产品),然后必须验证所有缺货的产品都在最后。 / p>

问题:我已经浏览了所有页面并将产品名称存储在ArrayList中。

让我们说list1,内容是-

[instant bcaa, vegan bcaa, complete bcaa energy™, branched chain amino acid (bcaa) tablets 1000mg, endure™, branched chain amino acids (bcaa), instant leucine, leucine tablets 1000mg, complete intra-workout™, leucine, bcaa jelly mix, complete hydration drink™, informed bcaa™, instant bcaa cocktail bundle]

现在我还有另一个列表,里面只有缺货产品

list2,内容为-

[informed bcaa™, instant bcaa cocktail bundle]

我必须确保 list1是否具有相同顺序的最后所有list2项目

5 个答案:

答案 0 :(得分:4)

此问题实质上是试图验证给定列表$vehicles = DB::table('vehicles')->get(); $arr = []; foreach($vehicles as $veh) { if(isset( $arr[$veh->categoryname] )) { $arr[$veh->categoryname][] = $veh->brandname; } else { $arr[$veh->categoryname][] = $veh->categoryname; } } dd($arr); 以第二个列表A结尾。

您可以通过确定列表B的长度,从列表B的末尾回溯很多空格,然后对两个列表进行成对比较来实现此目的:

A

答案 1 :(得分:3)

Java 8 + 中,您可以使用stream().skip()跳过初始的list1.size() - list2.size()对象,然后与list2进行比较。

    if (list1.size() > list2.size()) {
        AtomicInteger ordinal = new AtomicInteger(0);
        boolean matched = list1.stream().skip(list1.size() - list2.size())
                .allMatch(item -> item == list2.get(ordinal.getAndIncrement()));

        System.out.println(matched);
    }

答案 2 :(得分:2)

生成一个新列表,即列表1的最后n个项目,其中n是列表2的长度。然后将列表3与列表1进行比较。

第三个列表可以这样发送:

hc

答案 3 :(得分:1)

要检查list1是否包含特定位置的list2,可以使用以下功能:

 public static boolean compareArrsFromPosition(List<?> list1, List<?> list2, int fromPosition) {
    if (list1.size()-fromPosition < list2.size()) return false;
    return list1.subList(fromPosition,fromPosition+list2.size()).equals(list2);
}

要检查list1的结尾,您可以像这样调用

compareArrsFromPosition(list1, list2, list1.size()-list2.size());

答案 4 :(得分:1)

或者,您可以反转两个List(线性时间,尽管可能需要空间来存储副本),并匹配所有根据列表B的大小迭代的元素(假设它将较小)):

public static boolean listEndsWith(List<?> A, List<?> B) {
    Collections.reverse(B); // modifies B, so you can choose to clone and reverse
    Collections.reverse(A);
    return IntStream.range(0, B.size())
            .allMatch(i -> A.get(i).equals(B.get(i)));
}