从Groovy列表中删除项目

9

我正在尝试从Groovy列表中删除一个项目。 我尝试了以下方法:

    List<User>  availableUsers = []

    availableUsers = workers

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

我也尝试过以下方法:
availableUsers.remove(user)

在两种情况下,列表都会被清空。有人知道发生了什么吗?

1
drop不正确:http://groovy.codehaus.org/groovy-jdk/java/util/List.html#drop(int) - Fildor
4个回答

17

1
在处理大型列表及其数据较为复杂时,减法运算符不是最佳选择。请参考:http://rewoo.wordpress.com/2012/11/19/the-weak-performance-of-the-groovy-minus-operator/ - Phat H. VU
5
当然,您是正确的。需要按照以下顺序完成任务:1. 让它运行起来;2. 使它正确运行;3. 使它快速运行。 - Fildor

13

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

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仍然很陌生,但其中一个基本原则是它几乎总有一种方法可以将常见任务变成简单的一行代码。添加或删除集合中的项肯定符合这个原则。


5

Fildor是正确的,但如果你只想从列表中删除第一个出现的user(减号将删除所有出现的),你可能需要类似以下的内容:

list = list.indexOf( user ).with { idx ->
  if( idx > -1 ) {
    new ArrayList( list ).with { a ->
      a.remove( idx )
      a
    }
  }
  else list
}

1

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接