Java最小分区的两个或多个列表的公共元素(以相同顺序)

时间:2016-07-18 21:30:47

标签: java list matching

我正在寻找一种快速而聪明的方式来查找两个列表相等的位置。换句话说,我需要找到包含两个或更多列表的相同顺序的公共元素的最小分区。 这可能听起来有点令人困惑,但这是我想要实现的一个例子:

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的解决方案就像魅力一样,我发现它比我的更清晰。谢谢大家

2 个答案:

答案 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}" }]