7

I am trying to remove an item from groovy list. I've tried following:

    List<User>  availableUsers = []

    availableUsers = workers

    for (int i = 0; i < availableUsers.size(); i++) {
        if (availableUsers[i].equals(user)){
            availableUsers.drop(i)
            break
        }
    }

I've also tried:

availableUsers.remove(user)

In both cases the list gets emptied. Does anyone have any idea what's going on?

4

4 回答 4

16

你有没有尝试过

availableUsers - user

?

文档:http ://groovy.codehaus.org/groovy-jdk/java/util/List.html#minus(java.lang.Object ) 我自己对 groovy 没有太多经验,但这就是我会尝试的。

于 2013-04-25T10:08:47.340 回答
7

如上所述,答案取决于您是否希望删除所有出现的项目......

myList = ['a','b','c', 'c']
myList -= 'c'
assert myList == ['a','b']

...或者只是第一个实例。

myList = ['a','b','c', 'c']
myList.remove(myList.indexOf('c'))
assert myList == ['a','b','c'] 

我自己还是 Groovy 的新手,但其中一个基本原则是它几乎总是有一种方法可以让普通任务变得微不足道。从集合中添加或删除项目当然是合格的。

于 2018-05-16T15:14:20.420 回答
4

Fildor 是对的,但如果您只想删除user列表中第一次出现的 (减号将删除所有出现的),您可能需要以下内容:

list = list.indexOf( user ).with { idx ->
  if( idx > -1 ) {
    new ArrayList( list ).with { a ->
      a.remove( idx )
      a
    }
  }
  else list
}
于 2013-04-25T10:23:39.913 回答
0

我有一个相关的要求,但想删除多个知道它们的索引位置的项目。在循环中做到这一点并不容易,因为删除第一个项目后,其余项目的索引位置会发生变化。首先创建一个包含要删除的项目的列表,然后使用集合减去操作将它们从目标列表中删除似乎很容易。这是一个例子:

myList=['a','b','c','d']
remove=[0,1,2] //index list of list elements  to remove
removeList=myList[remove]
println removeList
assert ['d']== myList.minus(removeList)

限制:如果索引处的值在目标列表中多次出现,则删除所有实例。

因此,如果

myList=['a','b','c','d','a','e']
remove=[0,1,2]
removeList=myList[remove]
assert myList.minus(removeList)== ['d','e']

结果将是 d,e

于 2016-05-05T13:16:30.560 回答