LINUX.ORG.RU

Groovy: сохранить в новом списке элементы другого списка

 


0

1

Всем привет!

Что-то ни как не могу придумать внятного решения для такой задачи: есть два списка

def list1 = ["/dir/elem1","/dir/elem2","/dir/elem3","/dir/elem4","/dir/elem5","/dir/elem6",];
def list2 = ["elem1","elem6",];

Хочу из list1 удалить все элементы, кроме тех что есть в list2, что бы в итоге получилось:

def list3 = ["/dir/elem3","/dir/elem4","/dir/elem5","/dir/elem6",];

Делаю я это так:

list2.each {
    for (i in list1) { if (!i.contains(it)) { list2 << i}}
}

Проблема в том, что итоговый список содержит все элементы:

["/dir/elem2","/dir/elem3","/dir/elem4","/dir/elem5","/dir/elem6","/dir/elem1","/dir/elem2","/dir/elem3","/dir/elem4","/dir/elem5"]



Последнее исправление: gadzira (всего исправлений: 1)
Ответ на: комментарий от stave

Потому что ConcurrentModificationException, т.е. нельзя удалять элементы коллекции во время итерации. Хотя я не шарю в groovy и там ест какой-то обход.

gadzira
() автор топика
Ответ на: комментарий от stave

Тогда я не понимаю тебя. Итерируется оба list'а

gadzira
() автор топика

что у тебя за ненормальная любовь к поиску через contains?
стоит переделать логику на точные значения и внезапно хватает intersect для сравнения списков.

def list1 = ["/dir/elem1","/dir/elem2","/dir/elem3","/dir/elem4","/dir/elem5","/dir/elem6",];
def list2 = ["/dir/elem1","/dir/elem6","/dir/elem666"];

println list1.intersect(list2)
//[/dir/elem1, /dir/elem6]

system-root ★★★★★
()
Ответ на: комментарий от system-root

Это от незнания все.

Но мне нужно получить в итоге те элементы которых нет в list2, т.е. "/dir/elem4","/dir/elem5","/dir/elem6"

gadzira
() автор топика
Ответ на: комментарий от gadzira

Хочу из list1 удалить все элементы, кроме тех что есть в list2
Но мне нужно получить в итоге те элементы которых нет в list2

только Аллах знает чё ты там хочешь.

system-root ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.