ArrayList one包含
['a', 'b', 'm', 'd']
ArrayList二包含
['c', 'a', 't', 'b', 'u', 'm', 'd'].
如果two.containsAll(one)返回true,
如何检查一个元素中的所有元素是否按顺序排列? 换句话说: 如何检查位置顺序是否为[a< b< m< d]两个,因为他们处于这个位置。
答案 0 :(得分:0)
假设second
中没有重复项,second
包含first
中的所有元素,您可以使用List.indexOf
来比较first
中的相邻元素}:
static <T> boolean ordered(List<? extends T> first, List<? extends T> second) {
if (!first.isEmpty()) {
int prev = second.indexOf(first.get(0));
for (int i = 1; i < first.size(); ++i) {
if (prev > (prev = second.indexOf(first.get(i)))) {
return false;
}
}
}
return true;
}
示例调用:
System.out.println(ordered(
Arrays.asList('a', 'b', 'm', 'd'),
Arrays.asList('c', 'a', 't', 'b', 'u', 'm', 'd'))); // Prints true.
System.out.println(ordered(
Arrays.asList('a', 'b', 'd', 'm'),
Arrays.asList('c', 'a', 't', 'b', 'u', 'm', 'd'))); // Prints false.
答案 1 :(得分:0)
我建议采用以下程序:
ArrayList
一和二的可修改副本以用作工作空间(即work1
和work2
)。work2
中未显示的work1
的所有元素(请考虑方法retainAll()
)。这些对分析没有任何贡献。work2
中的其余元素,并用该元素的单个实例替换同一元素的任何连续运行。 (我想这里的列表一个不包含任何欺骗;如果可能的话,那么也会在work1
上执行重复删除。)work1
中移除work2
中未显示的任何元素。这些与work2
的订单问题无关。equals()
)。它处理所有情况,包括列表2包含重复元素和/或不包含列表1的所有元素的情况(即使其中一个或两个列表为空)。
或者,您无需通过此过程复制或修改列表即可完成此操作:
迭代列表一,并为每个元素e1
e1
)中找到lastIndexOf()
的最后一个外观(如果有)。如果出现,那么e1
后面的每个元素扫描列表2的前面元素(考虑形成列表2的subList()
并使用其contains()
方法)。假设列表一中没有欺骗。当且仅当在步骤2中执行的扫描没有资助任何元素时,列表2与列表1定义的顺序一致。
无论哪种方式,你的家庭作业的实际代码都由你来写。
答案 2 :(得分:0)
我刚使用KMP算法概念并将其应用于列表。
public boolean containsAll(ArrayList<Integer> list1, ArrayList<Integer> list2)
{
if(list1.size() == 0 || list2.size() < 0)
return false;
int k = 0;
int list1Size = list1.size();
int x = list1.get(k);
for(int i = 0; i < list2.size(); ++i)
{
if(list2.get(i) == x)//if an element matches then goto the next element in list2
{
k++;
if(k == list1Size)
return true;
x = list1.get(k);//get next element of list1 to match with
}
}
return false;
}