如果有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方法的任何建议吗?
答案 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]]
的数组开始,然后迭代example
。 inject
提供了运行累积和值。如果我们添加一个日志行:
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