我正在寻找一种快速而聪明的方式来查找两个列表相等的位置。换句话说,我需要找到包含两个或更多列表的相同顺序的公共元素的最小分区。 这可能听起来有点令人困惑,但这是我想要实现的一个例子:
List 1: A, B, C, L, M Z
List 2: A, B, C, K, F
Output -> List 3: A, B, C
我需要在一个递归方法中使用它,这个方法应该用大输入调用,而我提出的所有解决方案都有点太慢了。
提前感谢您的回答
编辑: 请原谅我不清楚。这是我的第一个问题,英语不是我的第一语言。
让我以更好的方式解释这个问题。我需要从列表的第一个元素开始找到两个或多个列表的交集。请注意,元素必须处于相同的顺序,因此它不是一个交叉点,而更像是一个分区。
“递归”的事情只是说我需要将它包含在一个递归方法中,该方法将运行多次,所以我希望解决方案尽可能快,以免损失大量时间。
处理似乎已被删除的答案我想出了自己的解决方案:
List<String> list1 = new ArrayList<>(Arrays.asList("ciao", "come"));
List<String> list2 = new ArrayList<>(Arrays.asList("ciao", "come", "va"));
List<String> list3 = new ArrayList<>(Arrays.asList("ciao", "come", "va", "?", "tutto", "ok"));
List<List<String>> allLists = new ArrayList<>();
allLists.addAll(Arrays.asList(list1, list2, list3));
int min = Integer.MAX_VALUE;
int listIndex = 0;
for(List<String> list : allLists){
if(min > list.size()){
min = list.size();
listIndex = allLists.indexOf(list);
}
}
int index = 0;
boolean same = true;
while(index<min && same == true) {
String element = allLists.get(listIndex).get(index);
for(List<String> list : allLists){
if(!list.get(index).equals(element)){
same = false;
break;
}
element = allLists.get(listIndex).get(index);
}
if(same == true) ++index;
}
System.out.println("OUTPUT:" + allLists.get(listIndex).subList(0, index));
----> Output: ciao, come
EDIT2:
并且garnful的解决方案就像魅力一样,我发现它比我的更清晰。谢谢大家
答案 0 :(得分:0)
尝试:
public List<E> equalUntil(List<E> l1, List<E> l2) {
return equalUntilRec(l1.iterator(), l2.iterator(), new ArrayList<E>());
}
private int equalUntilRec(Iterator<E> it1, Iterator<E> it2, List<E> acc) {
if(!it1.hasNext() || !it2.hasNext()) {
return acc;
} else {
E e1 = it1.next();
E e2 = it2.next();
if(!e1.equals(e2)) {
return acc;
}
acc.add(e1);
return equalUntilRec(it1, it2, acc);
}
}
答案 1 :(得分:0)
这应该做的工作,并希望在性能方面做得很好:
[{ "21": "Jason" },
{ "22": "Britney" },
{ "25": "Donald" },
{ "#{id}": "#{name}" }]