Объединить списки, затем удалить из списка компонентов

1
List<Bean> one //blah;
List<Bean> two //blah;
List<Bean> three //blah;

List<Bean> myCombined = Lists.newArrayList();
myCombined.addAll(one);
myCombined.addAll(two);
myCombined.addAll(three);

то, если я удалю из основного списка, будет ли он удален из объединенного списка?

one.remove(myBean)
one.contains(myBean); //false
myCombined.contains(myBean); //true or false ?

Лучший способ добиться этого, если нет?

  • 0
    Я действительно не понимаю, отрицательные стороны этого вопроса. Может кто-нибудь объяснить причины понижения?
  • 0
    Действительно хороший вопрос. Кто-нибудь знает, есть ли библиотека, содержащая версию Iterables.concat которая возвращает List ?
Показать ещё 6 комментариев
Теги:
collections

4 ответа

2
Лучший ответ

addAll копирует элементы из исходного списка в список адресатов.

Поэтому, удаляя элемент из one это не повлияет на myCombined.

Что делать?

Чтобы просмотреть список, вы можете использовать Guava Iterables.concat(...):

Iterable<Bean> combinedView = Iterables.concat(one, two, three);
Iterables.contains(combinedView, myBean);  // true
one.remove(myBean);
Iterables.contains(combinedView, myBean);  // false

Вы также можете использовать Java Stream:

Stream<Bean> combined = Stream.of(one, two, three)
                              .reduce(Stream.empty(), Stream::concat)
                              .map(identity());
  • 0
    Обратите внимание, что возвращенный поток может быть использован только один раз.
  • 0
    Я не могу получить бит Stream для компиляции.
Показать ещё 1 комментарий
3

myCombined.contains(myBean); вернет true, поскольку Список является новым объектом и не относится к другому.

Лучший способ сделать это - создать метод, который очищает каждый список

public void removeObject(Bean b)
{
    this.one.remove(myBean);
    this.myCombined.remove(myBean);
}

Затем просто вызовите removeObject(myBean).

Посмотрите пример метода addAll (из ArrayList)

public boolean addAll(Collection<? extends E> c) {
    Object[] a = c.toArray();
    int numNew = a.length;
    ensureCapacityInternal(size + numNew);  // Increments modCount
    System.arraycopy(a, 0, elementData, size, numNew);
    size += numNew;
    return numNew != 0;
}

Вы можете ясно видеть, что он создает копию.

2

Нет, если вы удалите элемент из одного из базовых списков, он не будет "исчезать" из объединенного списка, так как объединенный список - это новый список, содержащий новые ссылки на элементы.

Чтобы выполнить то, что вам нужно, вам нужно просмотреть список по базовым спискам. Библиотека Google Guava предлагает это с помощью метода Iterables.concat():

Iterable<Bean> combined = Iterables.concat(one, two, three);

Обратите внимание, что возвращаемый Iterable не является List, а просто Iterable.

2

Фактически, оба списка будут иметь ссылки на один и тот же объект. Так что изменение от one изменится на myCombined.

Удаление из one будет просто удалить ссылку в one, но myCombined будет отслеживать свою собственную ссылку.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню