Предполагая, что данные списки не должны быть изменены путем удаления элементов или их сортировки (что, кстати, имеет сложность O (nlogn)), вам в основном нужна одна функция как «строительный блок» для реального решения. А именно, функция, которая проверяет, содержит ли одна коллекция любой элемент, который содержится в другой коллекции.
Конечно, это можно решить, используя Collection#contains
во второй коллекции. Но для некоторых коллекций (в частности, для списков) это имеет O (n), а общее время выполнения проверки будет O (n * n).
Чтобы избежать этого, вы можете создать Set
, который содержит все элементы второй коллекции. Для Set
гарантируется contains
метод O (1).
Затем, фактическая проверка может быть сделано удобно, с Stream#anyMatch
:
containing.stream().anyMatch(e -> set.contains(e))
Так что полный пример может быть
import java.util.Arrays;
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
public class DuplicatesInLinkedLists
{
public static void main(String[] args)
{
LinkedList<LinkedList<String>> lls =
new LinkedList<LinkedList<String>>();
LinkedList<String> list1 =
new LinkedList<String>(Arrays.asList("dog", "cat", "snake"));
LinkedList<String> list2 =
new LinkedList<String>(Arrays.asList("donkey", "fox", "dog"));
LinkedList<String> list3 =
new LinkedList<String>(Arrays.asList("horse", "cat", "pig"));
lls.add(list1);
lls.add(list2);
lls.add(list3);
checkDuplicates(lls);
}
private static void checkDuplicates(
List<? extends Collection<?>> collections)
{
for (int i = 0; i < collections.size(); i++)
{
for (int j = i + 1; j < collections.size(); j++)
{
Collection<?> ci = collections.get(i);
Collection<?> cj = collections.get(j);
boolean b = containsAny(ci, cj);
System.out.println(
"Collection " + ci + " contains any of " + cj + ": " + b);
}
}
}
private static boolean containsAny(Collection<?> containing,
Collection<?> contained)
{
Set<Object> set = new LinkedHashSet<Object>(contained);
return containing.stream().anyMatch(e -> set.contains(e));
}
}
Примечание стороны: код, который Вы отправили почти конечно, не имеет смысла в текущей форме.Декларация и создание списков обычно должны полагаться на List
:
List<List<String>> lists = new ArrayList<List<String>>();
lists.add(Arrays.asList("dog", "cat", "snake");
...
Если элементы списка должны мне изменяемый, то вы могли бы написать
lists.add(new ArrayList<String>(Arrays.asList("dog", "cat", "snake"));
или, аналогично, используйте LinkedList
вместо ArrayList
, но для набросанного варианта использования, я не могу себе представить, почему должна быть веская причина для намеренного использования LinkedList
вообще ...
вам нужен этот: 'for (item: lls) {System.out.println (yourFunc (item, lls))}'? – degr
Я бы использовал ['HashSet'] (https://docs.oracle.com/javase/8/docs/api/java/util/HashSet.html) вместо LinkedList, если у вас есть опция. – dsh