Java 从数组中删除唯一值
示例数组:[1,2,3,4,4,5,6,7,12,13,7,4] 我只想保留具有多个值的值。因此,我期望的最终结果是[4,4,4,7,7] 我可以找到如下的副本。但我怎样才能扭转这种局面呢?感谢您的指导。多谢各位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]) ) {
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]