【问题标题】:Non-repeating numbers in 2D array二维数组中的非重复数字
【发布时间】:2020-12-10 09:54:17
【问题描述】:

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

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);

【问题讨论】:

    标签: java arrays matrix


    【解决方案1】:

    数组索引为 0, 1, 2, ..., length-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) {
                ...
            }
        }
    }
    

    如果您的课程中已经处理了 Set/Map,则有更智能的解决方案。而且这种for-i2-for-j2循环也是可以优化的。

    【讨论】:

    • 其实我对 map 很感兴趣,但是我在编码中最大的问题是关于数组,我正在努力学习它是如何工作的!
    • 最好是做一个方法boolean findFurtherOn(int i0, int j0)
    【解决方案2】:

    从您的代码中假设您只查看第 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];
        }
    }
    

    【讨论】:

    • 只有两列,我从 1 开始循环
    【解决方案3】:

    您可以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]
    

    另见:How to find duplicate elements in array in effective way?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-19
      • 1970-01-01
      • 2017-06-22
      • 1970-01-01
      • 2011-10-18
      • 2013-03-09
      • 1970-01-01
      • 2021-07-08
      相关资源
      最近更新 更多