3

こんにちは、私は 2 次元配列 (具体的には 4x4 配列) を調べようとしていますが、どちらも繰り返される数字を見つけて、その数字が繰り返される回数を数えます。これまでのところ、機能する for ループが 4 つありますが、実際に必要以上のことを行います。

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 の基本しか知りません。

4

4 に答える 4

2

最良のアプローチは、数値の頻度を追跡する を維持することだと思いますMap<Integer, Integer>(つまり、配列内の各数値を出現回数にマップします)。配列全体をループして、それに応じてこのマップを更新することは難しくありません。あなたが今していることは、必要以上に複雑に思えます (私の意見では)

そして、なぜ4 つの for ループを使用しているのですか? おそらく私はあなたの特定のコードの目的を誤解していますが、2D配列をループするために必要なのは2つだけです(そして最終的に数周波数を数えます):

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

関連ドキュメント:

于 2012-11-14T00:34:08.743 に答える
2

この配列を に変換しMap<Integer, Integer>てから、次のように出力します。

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

ここで結果を確認できます。

于 2012-11-14T00:38:00.650 に答える
0

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]++;
    }
}
于 2012-11-14T00:50:20.200 に答える
0

最も一般的な解決策は、他の人が示唆しているように、マップを使用することです。ただし、配列値が比較的狭い範囲内にある場合は、マップの代わりに配列を使用できます。が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;
}

返された配列では、indexval - minの値は、配列内で値が出現する回数になりますval

于 2012-11-14T00:39:27.303 に答える