Проверьте, содержит ли ArrayList каждый элемент из другого ArrayList

Вероятно, есть простой однострочный шрифт, который я просто не нахожу здесь, но это мой вопрос:

Как проверить, содержит ли ArrayList все объекты в другом массиве ArrayList? Я смотрю (если он существует) на что-то вроде:

//INCORRECT EXAMPLE:
if(one.contains(two))
{
    return true;
}
else
{
    return false;
}

Например:

ArrayList one = {1, 2, 3, 4, 5}

ArrayList two = {1, 2, 3} --> True
ArrayList two = {} --> True
ArrayList two = {1, 2, 3, 4, 5} --> True
ArrayList two = {1, 5, 2} --> True
ArrayList two = {1, 7, 4} --> False
ArrayList two = {0, 1, 3} --> False
ArrayList two = {4, 5, 6} --> False
ArrayList two = {7, 8, 9} --> False

Ответ 1

Существует метод, называемый containsAll объявленный в интерфейсе java.util.Collection. В вашей настройке one.containsAll(two) дает желаемый ответ.

Ответ 2

В интерфейсе списка:

myList.containsAll(...);

Ответ 3

Взгляните на метод containsAll(Collection<?> c) из интерфейса List. Я думаю, это то, что вы ищете.

Ответ 4

Вы можете использовать метод containsAll для проверки. Однако это линейная операция. Если список большой, вы должны сначала HashSet его в HashSet, а затем выполнить containsAll:

HashSet tmp = new HashSet(one);
if (tmp.containsAll(two)) {
    ...
}

Если длина one равна N а длина двоичного числа равна M, это решение имеет временную сложность O(M+N); "plain" containsAll имеет сложность O(M*N), что может быть значительно хуже.

Ответ 5

Ваш код в примере не имеет смысла, но вот пример в любом случае.

ArrayList<Integer> one, two;
//initialize
boolean good = true;
for (int i = 0; i < two.size(); i ++) {
    if (!(one.contains(two.get(i))) {
        good = false;
        break;
    }
}

Он просто прокручивает все two элемента и проверяет, находятся ли они в one.

Тогда булева good содержит значение, которое вы хотите.

См. ArrayList # содержит.

EDIT: О, ничего себе, я полностью забыл, что содержит все. Ну, это альтернативный способ сделать это, если вы действительно хотите это понять.

Ответ 6

Вот еще один пример использования containsAll(), который я использовал для утверждения, что два массива равны в тестировании JUnit:

List<String> expected = new ArrayList<String>();
expected.add("this");
expected.add("that");
expected.add("another");

List<String> actual = new ArrayListString();
actual.add("another");
actual.add("that");
actual.add("this");

Assert.assertTrue("The lists do not match!", expected.containsAll(actual));