如何过滤List邻居是否相等?请求类似unique()的东西

时间:2017-11-24 12:13:09

标签: groovy

如果有af字符串列表,如何过滤如此相等的邻居只出现一个?

示例:

['0.1', '0.1', '0.2','0.3','0.3','0.1','0.2'] 

应该导致

['0.1', '0.2','0.3','0.1','0.2'] 

注意元素0,1只出现一次,元素4和5也只出现一次。

如果使用unique:

['0.1', '0.1', '0.2','0.3','0.3','0.1','0.2'].unique()

结果将是:

['0.1', '0.2','0.3'] //what is not wanted

有关最佳groovy方法的任何建议吗?

3 个答案:

答案 0 :(得分:2)

一个简单的选择是使用尾随值进行迭代:

def example =  ['0.1', '0.1', '0.2','0.3','0.3','0.1','0.2']
def array = []
def trailing = -999

example.each { item ->
    if (item != trailing) { array << item }
    trailing = item 
}

assert ['0.1','0.2','0.3','0.1','0.2'] == array

答案 1 :(得分:1)

因此,如果你想删除重复的邻居,你应该从当前循环中获取下一个项目。我提出这样的事情:

def example =  ['0.1', '0.1', '0.2','0.3','0.3','0.1','0.2']
def array = []
example.eachWithIndex { item, index ->
    def next = index  < example.size() - 1 ? example[ index  + 1 ] : null
    if(next != item) {
        array.push(item)
    }
}

println array ​

答案 2 :(得分:1)

另一种更实用的方法如下,使用inject(在其他语言中称为 reduce ):

def example = ['0.1','0.1','0.2','0.3','0.3','0.1','0.2']

def array = example.inject([example[0]]) { acc, val ->
    if (val != acc[-1]) { acc << val }
    acc
}

assert ['0.1','0.2','0.3','0.1','0.2'] == array

关键是从包含第一个元素[example[0]]的数组开始,然后迭代exampleinject提供了运行累积和值。如果我们添加一个日志行:

def array = example.inject([example[0]]) { acc, val ->
    println "acc: ${acc} val: ${val}"
    if (val != acc[-1]) { acc << val }
    acc
}

然后输出:

acc: [0.1] val: 0.1
acc: [0.1] val: 0.1
acc: [0.1] val: 0.2
acc: [0.1, 0.2] val: 0.3
acc: [0.1, 0.2, 0.3] val: 0.3
acc: [0.1, 0.2, 0.3] val: 0.1
acc: [0.1, 0.2, 0.3, 0.1] val: 0.2