如何过滤列表邻居相等?请求唯一()之类的东西



如果有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也仅出现一次。

如果使用唯一:

['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

关于最佳时髦方法的任何建议?

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

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

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

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 ​

使用inject(以其他语言为 redable dred ):

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

最新更新