二维数组中的非重复数字



我的代码有问题,我想在数组中找到不重复的数字,但我不知道怎么做!

1 2
3 4
1 4

例如,在这种情况下,我希望输出为数字3和2:

我用这个代码来获取数组,它就像一个矩阵

for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 2; j++) {
cam[i][j] = in.nextInt();
}
}

像这样的东西,用来比较每一个:

for (int i = 1; i <= 3; i++) {            
if (cam[i][2] != cam[i+1][2]) {
y = cam[i+1][2];
break;
}            
}

更新:整个代码低于

int x=0,y=0;
int[][] cam = new int[10][10];
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 2; j++) {
cam[i][j] = in.nextInt();
}
}
for (int i = 1; i <= 3; i++) {          
if (cam[i][1] != cam[i+1][1]) {
x = cam[i+1][1];
break;
}
for (int i = 1; i <= 3; i++) {            
if (cam[i][2] != cam[i+1][2]) {
y = cam[i+1][2];
break;
}            
}
System.out.println(x+" "+y);

数组索引为0,1,2。。。,长度-1.

for (int i = 0; i < cam.length; i++) {
for (int j = 0; j <= cam[i].length; j++) {
cam[i][j] = in.nextInt();
}
}

搜索代码:

for (int i = 0; i < cam.length; i++) {
for (int j = 0; j <= cam[i].length; j++) {
int valueAtIJ = cam[i][j];
boolean found = false;
... walk here through cam using valueAtIJ, set found, skip i, j.
if (!found) {
...
}
}
}

如果在您的课程中处理已阅读的集合/地图,则会有更聪明的解决方案。但这种for-i2-for-j2环路也可以进行优化。

从您的代码中假设您只在第1列和第2列中查找(您在第0列中有其他数据吗?(:

for (int i = 1; i <= 3; i++) {
found = false;
for (int i1 = i + 1; i1 <= 3; i1++) {
if (cam[i][1] == cam[i1][1]) {
found = true;
break;
}
}
if (!found) {
x = cam[i][1];
}
}
for (int i = 1; i <= 3; i++) {
found = false;
for (int i1 = i + 1; i1 <= 3; i1++) {
if (cam[i][2] == cam[i1][2]) {
found = true;
break;
}
}
if (!found) {
y = cam[i][2];
}
}

您可以从这个2d数组中collect一个重复的映射,然后迭代这个映射并将filter应用于非重复元素:

int[][] arr = {
{1, 2},
{3, 4},
{1, 4}};
Map<Integer, Long> map = Arrays.stream(arr)
.flatMapToInt(Arrays::stream).boxed()
.collect(Collectors.groupingBy(
Integer::intValue, Collectors.counting()));
System.out.println(map); // {1=2, 2=1, 3=1, 4=2}
int[] arr2 = map.entrySet().stream()
.filter(e -> e.getValue() == 1)
.mapToInt(Map.Entry::getKey)
.toArray();
System.out.println(Arrays.toString(arr2)); // [2, 3]

另请参阅:如何以有效的方式找到数组中的重复元素

最新更新