【问题标题】:removing a specific value from a groovy list从 groovy 列表中删除特定值
【发布时间】:2013-05-24 08:33:30
【问题描述】:

我的代码 sn-p 如下所示,我想在条件检查的 else 部分的列表中忽略/删除该值。 offerRecords.remove(tariffOffer) 似乎不起作用

offerRecords.each { tariffOffer ->

    handsetData.each { hs ->
        if (tariffOffer.HANDSET_BAND.stringValue() == hs.HANDSET_BAND?.stringValue()) {
            //println 'condition is satisfied and set the handset id ****** '
            handset.add(hs.HANDSET_PKEY_ID?.stringValue())
        }

        if (handset.size() > 0) {
            // need to call a method
            recHandset = applyHandsetRulesCHL(tariffOffer, handset)
        }
        else {
            // ignore/remove the tariffOffer
            offerRecords.remove(tariffOffer) // i know it doesn't serve the purpose
        }

【问题讨论】:

  • handset 是什么?你能想出一些我们可以运行的代码来显示问题吗?我怀疑你想要一个findAll
  • def hander = [],handler 是一个列表,因为我的代码 sn-p 是我整个程序的一小部分,我很难给出一个可以独立运行的示例

标签: java groovy


【解决方案1】:

在处理之前过滤您的列表:

def filteredList = handsetData.findAll{handset.size() > 0}

并处理过滤结果。顺便说一句,我不明白each{} 正文中的handset 是什么,但我想你明白了。

【讨论】:

  • findAll 似乎没有根据条件 hmmm 过滤列表
  • findAll 返回过滤结果,不影响集合本身
【解决方案2】:

这是典型的java并发修改。

即迭代列表时不能修改列表。

除了猫先生早先提出的在迭代之前过滤数据的建议外,还有很多解决方案取决于您的用例的其他因素,请参阅This SO question。

一个例子是保留无效条目的并行列表,然后在迭代完成后将它们从原始列表中删除:

def listToTest = ['a', 1, 'b', 'c']

def invalidItems = []
listToTest.each {
    if (it == 1)
        invalidItems << it
}

listToTest.removeAll invalidItems

assert ['a', 'b', 'c'] == listToTest

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-06
    • 1970-01-01
    • 2019-08-10
    相关资源
    最近更新 更多