Ответ 1
List<Integer> c = new ArrayList<>(a);
c.removeAll(b);
Также рассмотрите использование наборов вместо списков.
Мне нужно найти лучший способ узнать, что элементы, которые не представлены во втором arraylist. предположим, что
Arraylist a,b,
Arraylist a={1,2,3,4,5};
Arraylist b={2,3,4};
Итак, в основном я хочу узнать, что элементы a, которые отсутствуют в arraylist b.
Итак, каковы наилучшие решения для этого?
List<Integer> c = new ArrayList<>(a);
c.removeAll(b);
Также рассмотрите использование наборов вместо списков.
Вы можете попробовать removeAll
:
List<Integer> notPresent = new ArrayList<Integer>(a);
notPresent.removeAll(b);
Вы можете использовать Apache Commons Collections, который явно использует метод для этой цели:
public static void main(String[] args) {
List<Integer> a = Arrays.asList(new Integer[] { 1, 2, 3, 4, 5 });
List<Integer> b = Arrays.asList(new Integer[] { 2, 3, 4 });
Collection<Integer> aMinusB = CollectionUtils.subtract(a, b);
System.out.println(aMinusB);
}
Печатный результат: [1, 5].
Apache Commons libs хорошо протестированы и обычно используются для расширения стандартных функциональных возможностей Java. Этот конкретный метод принимает Iterable
как параметры, поэтому вы можете использовать любой Collection
, который вы хотите. Вы также можете смешивать различные типы коллекций:
public static void main(String[] args) {
List<Integer> a = Arrays.asList(new Integer[] { 1, 2, 3, 4, 5 });
Set<Integer> b = new HashSet<Integer>(Arrays.asList(new Integer[] { 2, 3, 4 }));
Collection<Integer> aMinusB = CollectionUtils.subtract(a, b);
System.out.println(aMinusB);
}
Печатный результат тот же, [1, 5].
Ознакомьтесь с Javadoc здесь.
Для полноты, Google Guava библиотека не имеет эта функция:
Collection *subtract*(Collection, Collection)
Нет эквивалента - создайте ArrayList, содержащий a, а затем вызовите remove для него для каждого элемента в b.
Однако он реализует метод Sets.difference()
, который можно использовать, если вы предпочитаете Guava и работаете с наборами:
public static void main(String[] args) {
Set<Integer> a = new HashSet<Integer>(Arrays.asList(new Integer[] { 1, 2, 3, 4, 5 }));
Set<Integer> b = new HashSet<Integer>(Arrays.asList(new Integer[] { 2, 3, 4 }));
Set<Integer> aMinusB = Sets.difference(a, b);
System.out.println(aMinusB);
}
В результате все элементы в a
, которые не существуют в b
(т.е. [1, 5]). Конечно, порядок не определяется, так как он работает с множествами.
Используйте org.apache.commons.collections4.ListUtils
Учитывая
List<Integer> a = Arrays.asList(new Integer[]{ 1,2,3,4,5});
List<Integer> b = Arrays.asList(new Integer[]{0,1,2,3});
Действие
List<Integer> c = ListUtils.removeAll(b, a)
Результат в списке c
4, 5
Пожалуйста, попробуйте вот так
for (Object o : a) {
if (!b.contains(o)) {
// this is not present
}
}
Прокрутите один список, затем проверьте, есть ли каждый элемент в другом списке с помощью contains.
Что-то вроде этого. Если вы думаете, что в a
могут быть дубликаты, вы можете попробовать другой тип Collection
, например a Set
для notPresent
.
List<Integer> notPresent = new ArrayList<Integer>();
for (Integer n : a){
if (!b.contains(n)){
notPresent.add(n);
}
}
Попробуйте следующее:
public static void main(String[] args) {
List<Integer> a = new ArrayList<Integer>();
List<Integer> b = new ArrayList<Integer>();
List<Integer> exclusion = new ArrayList<Integer>();
a.add(1);
a.add(2);
a.add(3);
a.add(4);
b.add(1);
b.add(2);
b.add(3);
b.add(5);
for (Integer x : a) {
if (!b.contains(x)) {
exclusion.add(x);
}
}
for (Integer x : exclusion) {
System.out.println(x);
}
}
Попробуйте это...
Используйте метод contains()
списка.
ArrayList<Integer> aList = new ArrayList<Integer>();
for (Integer i : a){
if (!(b.contains(i))){
aList.add(i);
}
else{
continue;
}
}