代码之家  ›  专栏  ›  技术社区  ›  NarendraR TheSociety

如何在特定位置将一个arraylist的多个项目与另一个arraylist进行比较?

  •  5
  • NarendraR TheSociety  · 技术社区  · 7 年前

    有一个产品列表页面,我必须抓取所有产品名称(包括缺货产品),然后必须验证所有缺货产品是否都在最后。

    问题: 我浏览了所有页面,并将产品名称存储在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]
    

    我必须确定 列表1的末尾有相同顺序的所有列表2项

    5 回复  |  直到 7 年前
        1
  •  4
  •   nbrooks    7 年前

    这个问题本质上是试图验证给定的列表 A ,以第二个列表结束 B .

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

    public static boolean listEndsWith(List<?> A, List<?> B) {
        if (B.size() > A.size()) {
            return false;
        }
    
        for (int i = A.size() - B.size(), j = 0; i < A.size(); i++, j++) {
            if (!A.get(i).equals(B.get(j))) {
                return false;
            }
        }
    
        return true;
    }
    
        2
  •  3
  •   Naghaveer R    7 年前

    在里面 爪哇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);
        }
    
        3
  •  2
  •   nbrooks    7 年前

    生成一个新列表,即列表1的最后n项,其中n是列表2的长度。然后比较清单3和清单1。

    第三个列表可以如下所示:

    ArrayList list3 = new ArrayList(list1.subList(list1.size() - list2.size(), list2.size())
    
        4
  •  1
  •   Dim78    7 年前

     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);
    }
    

    要检查列表1的结尾,可以这样调用

    compareArrsFromPosition(list1, list2, list1.size()-list2.size());
    
        5
  •  1
  •   Naman    7 年前

    或者,您可以同时反转两个方向 List s(虽然线性时间可能需要空间来存储副本)并根据列表的大小匹配迭代的所有元素 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)));
    }