背景:有一个产品列表页面,我必须获取所有产品名称(包括缺货的产品),然后必须验证所有缺货的产品都在最后。 / 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项目
答案 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)));
}