Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从数组中删除唯一值_Java_Arrays_Groovy - Fatal编程技术网

Java 从数组中删除唯一值

Java 从数组中删除唯一值,java,arrays,groovy,Java,Arrays,Groovy,示例数组:[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]) ) {

示例数组:[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 
        } 
    } 
}

以下是一个非最佳想法:

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将链表更改为数组,您可以在Groovy中执行以下操作:

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


当然还有一个使用Java8流的解决方案

        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();
常规解决方案 我喜欢@tim_yates解决方案,但这里有另一个解决方案:

def result = names.findAll{ names.count(it) > 1}
您还可以按标识分组,获取值,仅保留大小大于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]

只需将所有重复项保存在数组/a列表中。然后使用另一个循环从原始阵列中删除列表中的循环。这个标记为Java和groovy的循环是什么?你想要哪个?@tim_yates用Groovy写这篇文章,但是Java解决方案也可以。dsharew,简单又漂亮。OP已给出预期输出。在findAll上应用.sort可以得到相同的结果。
[1,2,3,4,4,5,6,7,12,13,7,4]
    .groupBy()
    .values()
    .findAll{it.size()>1}
    .sum()
// [4, 4, 4, 7, 7]