【问题标题】:How do i find and count duplicates in a 2 dimensional array?如何在二维数组中查找和计算重复项?
【发布时间】:2012-11-02 12:05:10
【问题描述】:

您好,我正在尝试遍历一个二维数组(特别是 4x4 数组)并且都找到任何重复的数字,然后计算该数字重复的次数。到目前为止,我有 4 个 work 的 for 循环,但是比我真正想要的要多。

int counter1 =1;
    String huh="";

    for (int x = 0; x< dataTable.length; x++)
    {
        for (int y=0; y< dataTable.length; y++)
        {
            for (int z = 0; z< dataTable.length; z++)
            {
                for (int a=0; a< dataTable.length; a++)
                {
                    if ( x != z && x !=a && y != z && y !=a)
                    {
                        if (dataTable[x][y] == dataTable[z][a])
                        {
                        counter1++;
                        }
                    }   
                }
            }
        if (counter1 > 1)
        {
        huh += ("\n " + dataTable[x][y] + " repeats " + counter1 + " times!");
        }
        counter1=1;
        }
    }

基本上,它会将数组中的每个数字与包括自身在内的所有其他数字进行比较(但 if 语句阻止它自己计算)。基本上我需要输出来说明一些简单的事情,比如

The number 3 repeats 3 times

但是,根据我的设置工作方式,每次比较数组中每个位置的数字 3 时,都会将相同的语句添加到字符串中。那么我的方法是否正确,只需要一些调整?还是完全错了,我需要完全不同的东西?我只是在我大学的初学者编程课上,所以我们只知道 Java 的基础知识,比如数组、循环和其他一些东西。

【问题讨论】:

标签: java arrays for-loop


【解决方案1】:

我认为最好的方法是维护一个跟踪数字频率的Map&lt;Integer, Integer&gt;(即,它将数组中的每个数字映射到它出现的次数)。遍历整个数组并相应地更新此映射并不难。你现在正在做的事情似乎方式比它真正需要的要复杂(在我看来)。

你为什么要使用 4 for 循环?也许我误解了您的特定代码的目的,但是您应该只需要两个来循环二维数组(并最终计算数字频率):

for (int[] a : array)
    for (int i : a)
        // do something

相关文档:

【讨论】:

  • +1 表示 Map 解决方案。因为它是一个 4 维数组,而不是一个 2 维数组。
  • @MikeJohnson 你怎么知道?
  • 好吧,从这个问题,我猜 - “嗨,我正在尝试通过一个二维数组(特别是 4x4 数组)”。我认为 Impalaguy 表示 4 维数组(不是 4x4=16 维,这将是很多维:-D)
  • 我认为他的意思可能是一个 4 行 4 列的二维数组(例如int[4][4])。
  • 哦,对了,我的错。所以它只是两个循环,而不是四个。为答案+1
【解决方案2】:

只需将此数组转换为Map&lt;Integer, Integer&gt;,然后将其打印出来,如下所示:

    public static void main(String[] args) throws Exception {
        final int[][] dataTable = new int[][] {
                new int[] {0, 1, 2, 1},
                new int[] {0, 1, 3, 1},
                new int[] {0, 1, 2, 2},
                new int[] {0, 1, 2, 0}
        };

        final Map<Integer, Integer> map = new HashMap<Integer, Integer> ();
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                final int value = dataTable[i][j];
                final Integer currentCount = map.get(value);
                final Integer newCount;
                if (currentCount == null) {
                    newCount = 1;
                }
                else {
                    newCount = currentCount + 1;
                }

                map.put (value, newCount);
            }
        }

        for (final Map.Entry<Integer, Integer> entry : map.entrySet()) {
            System.out.println(String.format ("The number %d repeats %d times", entry.getKey(), entry.getValue()));
        }
    }   

Here你可以找到结果。

【讨论】:

    【解决方案3】:

    正如其他人所建议的那样,最通用的解决方案是使用地图。但是,如果数组值在相对较小的范围内,则可以使用数组而不是映射。如果min (最多)是数组中的最小值,max (至少)是最大值:

    public int[] getFrequencyMap(int[][] array, int min, int max) {
        int[] map = new int[max - min + 1];
        for (int[] row : array) {
            for (int val : row) {
                map[val - min]++;
            }
        }
        return map;
    }
    

    在返回的数组中,索引val - min 处的值将是值val 在数组中出现的次数。

    【讨论】:

      【解决方案4】:

      你可以有一个 n*n 行和 2 列的数组:

      /*being n the number of rows/columns*/
      int count[]][] = new int[n*n][2];
      
      for (int i = 0; i < dataTable.length; i++) {
      
          for (int k = 0; k < dataTable.length; k++) {
      
              /*this loop finds the position in which it should go*/
              for (int h = 0; h < n*n; h++) {
                  if (count[h][0] == dataTable[i][k]) {
                      break;
                  }
      
                  /*Assuming that '0' is not a possible number in dataTable, use '-1' or a number that */
                  if (count[h][0] == 0) {
                      break;
                  }
              }
      
              count[h][0] = dataTable[i][k];
              count[h][1]++;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-29
        • 2019-08-16
        • 1970-01-01
        • 2017-11-15
        • 1970-01-01
        • 1970-01-01
        • 2014-01-26
        • 1970-01-01
        相关资源
        最近更新 更多