繁体   English   中英

从数组中删除唯一值

[英]Remove unique values from array

数组示例:[1,2,3,4,4,5,6,7,12,13,7,4]

我只想保留多个值。 因此,我期望的最终结果是[4,4,4,7,7]

我可以找到重复项,如下所示。 但是我该如何扭转呢? 任何指导表示赞赏。 谢谢。

for (int i = 0; i < names.length; i++) { 
    for (int j = i + 1; j < names.length; j++) { 
        if (names[i].equals(names[j]) ) { 
            // got the duplicate element 
        } 
    } 
}

您可以在Groovy中执行以下操作:

def result = names.countBy { it }
                  .findAll { k, v -> v > 1 }
                  .collect { k, v -> [k] * v }
                  .flatten()

要么

def result = names - names.countBy { it }.findAll { k, v -> v == 1 }.keySet()

Groovy解决方案
我喜欢@tim_yates解决方案,但这是另一个解决方案:

def result = names.findAll{ names.count(it) > 1}

这是一个非最佳的想法:

Integer count;
for (int i = 0; i < names.length; i++) { 
    count = 0;
    for (int j = i + 1; j < names.length; j++) { 
        if (names[i].equals(names[j]) ) { 
            count++;
        } 
    } 
    if(count == 1){
        count = 0;
        ArrayUtils.removeElement(names, i);
    }
}

在if语句中,您可以简单地创建一个新的linkedList来存储重复的元素,并使用java.collections从Linked列表更改为array

当然,还有使用Java 8 Streams的解决方案...。

        int[] ia = {1,2,3,4,4,5,6,7,12,13,7,4};
        List<Integer> list = Arrays.stream(ia).boxed().collect(Collectors.toList());
        ia = list.stream()
                 .filter(x -> Collections.frequency(list, x) > 1)
                 .mapToInt(Integer::valueOf).toArray();

您还groupBy按身份groupBy ,取值,仅保留大于1的值,并合并结果:

[1,2,3,4,4,5,6,7,12,13,7,4]
    .groupBy()
    .values()
    .findAll{it.size()>1}
    .sum()
// [4, 4, 4, 7, 7]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM