所以結構是{{Dog,Cat,Human},{Human,Dog,Whale,rabbit,Cow},{Monkey,Human,Dog}}
。而不是交叉兩個列表如何相交超過兩個?
輸出應爲:Dog,Human
。
我不得不在更大的列表中找到列表元素的交集。以前,我看過代碼找到單獨的ArrayLists
的交叉點,但不知道如何在同一個ArrayList
(兩個以上)內完成。
對於單獨的ArrayLists
下面的代碼工作。但我怎麼讓它在一個更大的ArrayList
內的多個ArrayLists
工作?我在接受採訪時被問到了這一點。曾爲單獨的列表工作,但無法將其列爲同一個ArrayList
。
面試官明確聲明只能與字符串一起工作,所以我在澄清後將我的通用類型令牌從{<T>}
修改爲{<String>}
。
public class Test {
public <String> List<String> intersection(List<String> list1, List<String> list2) {
List<String> list = new ArrayList<>();
for (String t: list1) {
if(list2.contains(t)) {
list.add(t);
}
}
return list;
}
public static void main(String[] args) throws Exception {
List<String> list1 = new ArrayList<String>(Arrays.asList("Dog", "Cat", "Human"));
List<String> list2 = new ArrayList<String>(Arrays.asList("Human", "Dog", "Whale", "rabbit", "Cow"));
System.out.println(new Test().intersection(list1, list2));
}
}
這產生了兩個單獨的ArrayLists
正確的輸出。然而,如果輸入稍作修改,例如,對於輸入a,a,a
和a,a,
,交集方法將返回a,a,a
,但是其將輸入a,a
和a,a,a
給出a,a
。邏輯假設是它應該始終返回a,a
而不管參數的順序如何。
有關我如何解決這個問題的任何建議,不管輸入順序如何?我怎麼能找到一個更大的列表內的幾個列表(超過兩個)的交集?
提供你有一個工作'intersection'功能,你可以多次找到列表之間的交集返回的交點,以及新的列表。在面向功能的語言中,您只需使用'intersection'來摺疊/減少列表的列表。 – Carcigenicate
如果列表已排序,則可以使用拉鍊技術在「O(n)」中實現它。在每個列表上放置一個標記,最初分別位於索引0處。比較所有值,如果不同,則在顯示較小值的所有列表上推進標記。繼續,直到標記到達列表的末尾(一個足夠交叉)。例如,*信息檢索*中常用的技巧。 – Zabuza