Как сравнить несколько элементов массива в другом массиве в определенной позиции? - PullRequest
0 голосов
/ 07 декабря 2018

Справочная информация: есть страница со списком продуктов, и мне нужно захватить все название продукта (включая отсутствующий на складе продукт), а затем убедиться, что все продукты, отсутствующие на складе, находятся в конце.

Проблема: Я прошел по всей странице и сохранил названия продуктов в ArrayList.

скажем, list1 и содержимое -

[instant bcaa, vegan bcaa, complete bcaa energy™, branched chain amino acid (bcaa) tablets 1000mg, endure™, branched chain amino acids (bcaa), instant leucine, leucine tablets 1000mg, complete intra-workout™, leucine, bcaa jelly mix, complete hydration drink™, informed bcaa™, instant bcaa cocktail bundle]

Теперь у меня есть еще один список, в котором есть только товар "Нет в наличии"

list2, а содержимое -

[informed bcaa™, instant bcaa cocktail bundle]

Я должен убедиться, что list1 содержит все элементы list2 в конце в той же последовательности

Ответы [ 5 ]

0 голосов
/ 07 декабря 2018

Кроме того, вы можете отменить оба значения List s (хотя для линейного времени может потребоваться пространство для хранения копии) и сопоставить все элементы, повторяющиеся в зависимости от размера списка B (при условии, что оно будет меньшего размера) как:

public static boolean listEndsWith(List<?> A, List<?> B) {
    Collections.reverse(B); // modifies B, so you can choose to clone and reverse
    Collections.reverse(A);
    return IntStream.range(0, B.size())
            .allMatch(i -> A.get(i).equals(B.get(i)));
}
0 голосов
/ 07 декабря 2018

Чтобы проверить, что list1 содержит list2 из определенной позиции, вы можете использовать функцию:

 public static boolean compareArrsFromPosition(List<?> list1, List<?> list2, int fromPosition) {
    if (list1.size()-fromPosition < list2.size()) return false;
    return list1.subList(fromPosition,fromPosition+list2.size()).equals(list2);
}

Для проверки конца списка1 вы можете позвонить так:

compareArrsFromPosition(list1, list2, list1.size()-list2.size());
0 голосов
/ 07 декабря 2018

Создайте новый список, то есть последние n элементов списка 1, где n - длина списка 2. Затем сравните список 3 с списком 1.

3-й список можно доставить так:

ArrayList list3 = new ArrayList(list1.subList(list1.size() - list2.size(), list2.size())
0 голосов
/ 07 декабря 2018

Эта проблема, по сути, пытается проверить, что данный список A заканчивается вторым списком B.

. Вы можете реализовать это, определив длину списка B, отследив, что многиепробелы в конце списка A и последующее попарное сравнение обоих списков:

public static boolean listEndsWith(List<?> A, List<?> B) {
    if (B.size() > A.size()) {
        return false;
    }

    for (int i = A.size() - B.size(), j = 0; i < A.size(); i++, j++) {
        if (!A.get(i).equals(B.get(j))) {
            return false;
        }
    }

    return true;
}
0 голосов
/ 07 декабря 2018

В Java 8 + вы можете использовать stream().skip(), чтобы пропустить первоначальные list1.size() - list2.size() объекты, а затем сравнить с list2.

    if (list1.size() > list2.size()) {
        AtomicInteger ordinal = new AtomicInteger(0);
        boolean matched = list1.stream().skip(list1.size() - list2.size())
                .allMatch(item -> item == list2.get(ordinal.getAndIncrement()));

        System.out.println(matched);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...