7 ответов:
можно использовать
retainAllспособ:columnsOld.retainAll (columnsNew);
поскольку retainAll не будет касаться коллекции аргументов, это будет быстрее:
List<String> columnsOld = DBUtils.GetColumns(db, TableName); List<String> columnsNew = DBUtils.GetColumns(db, TableName); for(int i = columnsNew.size() - 1; i > -1; --i){ String str = columnsNew.get(i); if(!columnsOld.remove(str)) columnsNew.remove(str); }пересечение будет значения, оставленные в columnsNew. Удаление уже сравниваемых значений FOM columnsOld уменьшит количество необходимых сравнений.
как о
private List<String> intersect(List<String> A, List<String> B) { List<String> rtnList = new LinkedList<>(); for(String dto : A) { if(B.contains(dto)) { rtnList.add(dto); } } return rtnList; }
есть хороший способ с потоками, которые могут сделать это в одной строке кода, и вы можете два списка, которые не относятся к одному типу, что невозможно с помощью метода containsAll afaik:
columnsOld.stream().filter(c -> columnsNew.contains(c)).collect(Collectors.toList());пример для списков с различными типами. Если у вас есть realtion между foo и bar, и вы можете получить bar-объект от foo, чем вы можете изменить свой поток:
List<foo> fooList = new ArrayList<>(Arrays.asList(new foo(), new foo())); List<bar> barList = new ArrayList<>(Arrays.asList(new bar(), new bar())); fooList.stream().filter(f -> barList.contains(f.getBar()).collect(Collectors.toList());
Если вы поместите второй список в набор, скажем, HashSet. И просто повторите первый список, проверяя наличие на множестве и удаляя, если его нет, ваш первый список в конечном итоге будет иметь нужное вам пересечение. Это будет намного быстрее, чем retainAll или содержит в списке. Акцент здесь делается на использовании набора вместо списка. Поисковые запросы - O (1). firstList.retainAll (new HashSet (secondList)) также будет работать.
используя retainAll, если не волнуют вхождения, в противном случае используя N. пересечение
a = N.asList(12, 16, 16, 17, 19); b = N.asList(16, 19, 107); a.retainAll(b); // [16, 16, 19] N.println(a); a = N.asList(12, 16, 16, 17, 19); b = N.asList(16, 19, 107); a = N.intersect(a, b); N.println(a); // [16, 19]N-это служебный класс в AbacusUtil
Comments