Как скопировать список Наборов Java

Вам лучше не удалять элементы во время итерации. Вы можете сделать так:

for word in word_list[:]:
    if word[1] in badWords:
        word_list.remove(word)

print(word_list)
# [(309, 'răzvan')]

Вы можете прочитать wtfpython , это может помочь вам.

138
задан moffeltje 25 July 2018 в 05:46
поделиться

7 ответов

Вызов

List<String> b = new ArrayList<String>(a);

создает неглубокую копию a в b . Все элементы будут существовать в b в том же порядке, в котором они были в a (при условии, что у него был порядок).

Аналогично, вызов

// note: instantiating with a.size() gives `b` enough capacity to hold everything
List<String> b = new ArrayList<String>(a.size());
Collections.copy(b, a);

также создает неглубокую копию из a в пределах b . Если первый параметр, b , не имеет достаточной емкости (не размера), чтобы содержать все элементы a , то он выдаст ] IndexOutOfBoundsException . Ожидается, что для работы Collections.copy не потребуется никаких выделений, и если таковые имеются, затем он выбрасывает это исключение. Требование предварительного выделения скопированной коллекции ( b ) является оптимизацией, но я обычно не думаю, что эта функция того стоит из-за требуемых проверок с учетом альтернативных конструкторов, подобных показанной выше. не имеют никаких странных побочных эффектов.

Чтобы создать полную копию, список , с помощью любого механизма, должен обладать сложными знаниями о базовом типе. В случае String , которые неизменяемы в Java (и .NET в этом отношении), вам даже не нужна глубокая копия. В случае MySpecialObject вам нужно знать, как сделать его полную копию, и это не обычная операция.


Примечание: первоначально принятый ответ был лучшим результатом для Коллекций .copy в Google,

113
ответ дан 23 November 2019 в 23:26
поделиться

Копия не бесполезна, если Вы предполагаете, что вариант использования копирует некоторые значения в существующий набор. Т.е. Вы хотите перезаписать существующие элементы вместо вставки.

Пример: = [1,2,3,4,5] b = [2,2,2,2,3,3,3,3,3,4,4,4], a.copy (b) = [1,2,3,4,5,3,3,3,3,4,4,4]

Однако я ожидал бы метод копии, который возьмет дополнительные параметры для индекса запуска входного и выходного набора, а также параметр для количества.

Посмотрите ОШИБКУ Java 6350752

0
ответ дан 23 November 2019 в 23:26
поделиться

Если Вы хотите скопировать ArrayList, скопируйте его при помощи:

List b = new ArrayList();
b.add("aa");
b.add("bb");

List a = new ArrayList(b);
3
ответ дан 23 November 2019 в 23:26
поделиться
List b = new ArrayList(a.size())

не устанавливает размер. Это устанавливает начальную способность (являющийся, сколько элементов это может вписаться, прежде чем это должно будет изменить размер). Более простой способ скопировать в этом случае:

List b = new ArrayList(a);
9
ответ дан 23 November 2019 в 23:26
поделиться

Просто сделайте:

List a = new ArrayList(); 
a.add("a"); 
a.add("b"); 
a.add("c"); 
List b = new ArrayList(a);

ArrayList имеет конструктора, который примет, что другой Набор копирует элементы с

58
ответ дан 23 November 2019 в 23:26
поделиться

b имеет вместимость 3, но размер 0. Факт это ArrayList имеет своего рода буферную емкость, деталь реализации - это не часть List интерфейс, таким образом, Collections.copy(List, List) не использует его. Это было бы ужасно для него к особому случаю ArrayList.

Как MrWiggles указал, с помощью конструктора ArrayList, который берет набор, путь к в обеспеченном примере.

Для более сложных сценариев (который может включать Ваш реальный код), можно найти наборы в Гуаве полезными.

133
ответ дан 23 November 2019 в 23:26
поделиться

самый простой способ скопировать Список состоит в том, чтобы передать его конструктору нового списка:

List<String> b = new ArrayList<>(a);

b будет мелкая копия a

Рассмотрение источника Collections.copy(List,List) (Я никогда не видел его прежде), это, кажется, для привыкания индекса элементов индексом. использование List.set(int,E) таким образом элемент 0 будет по элементу записи 0 в целевом списке и т.д. и т.д. Не особенно ясный из javadocs я должен был бы признать.

List<String> a = new ArrayList<>(a);
a.add("foo");
b.add("bar");

List<String> b = new ArrayList<>(a); // shallow copy 'a'

// the following will all hold
assert a.get(0) == b.get(0);
assert a.get(1) == b.get(1);
assert a.equals(b);
assert a != b; // 'a' is not the same object as 'b'
12
ответ дан 23 November 2019 в 23:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: