-2

r行と列を持つマトリックスがありcます。行列を 2 次元配列に格納しました。下の図を参照してください。

ここに画像の説明を入力

各行の最小数を見つけます。最小数が最初の列にある場合、最小値を listC1 に追加します。

上の図を考えてみましょう。

最初の行 R1 の最小数は2で、列 C1 にあります。 に 2 を追加しlistC1ます。2行目R2の最小数は4C3列にあり、4を追加したいですlistC3。3 行目の R3 の最小数は5C2 列にあります。5 を に追加しlistC2ます。簡単に言えば、最小数が最初の列にある場合は最初のリストlistC1に最小数を追加し、最小数が2番目の列にある場合は2番目のリストlistC2に最小数を追加し、最小数が3番目の列にある場合は追加します3番目のリストの最小数listC3など。

私が直面している問題は、上記のロジックを実装するためにリストのリストを作成する方法です。いくつかのコードを開発しました (以下を参照) が、正しく動作しません。この点で私を助けてください

Note:  Ther number of columns may vary from 3 to 30



final float[][] matrix = {
            {2f, 8f, 5f},
            {9f, 7f, 4f},
            {8f, 5f, 6f},
            {7f, 3f, 9f},
            {1f, 5f, 5f},
            {8f, 7f, 5f},
        };

        Map<Integer, ArrayList<Float>> minsMap = new LinkedHashMap<>();



        for(int row=0; row < matrix.length; row++)
        {
            float min = Float.MAX_VALUE;
            int mc = 0;

            for(int col=0; col < matrix[row].length; col++)
            {
                if(matrix[row][col] < min) 
                {
                    min = matrix[row][col];
                    mc = col;
                }

                ArrayList<Float> minList = minsMap.get(mc);

                if(minList == null) 
                {
                    minList = new ArrayList<>();
                    minsMap.put(mc, minList);
                }
                minList.add(min);
            }

        }

        for(java.util.Map.Entry<Integer, ArrayList<Float>> e : minsMap.entrySet()) 
        {
            System.out.println("Min values in column " + e.getKey() + ": " + e.getValue());
        }
4

1 に答える 1

0

nestedGroupは一度だけ初期化され、すべての列に使用されます。これは正しくありません。列ごとにネストされたグループが必要です。

このコードを見てくださいMap。最小値のリストを保持するために a を使用しています。

private final static float[][] matrix = {
    {2f, 8f, 5f},
    {9f, 7f, 4f},
    {8f, 5f, 6f},
    {7f, 3f, 9f},
    {1f, 5f, 5f},
    {8f, 7f, 5f},
};


@Test
public void minOfMatrixColumn() {
    Map<Integer, List<Float>> minsMap = new LinkedHashMap<>();
    for(int r = 0; r < matrix.length; r++) {
        float min = Float.MAX_VALUE;
        int mc = 0;
        for(int c = 0; c < matrix[r].length; c++) {
            if(matrix[r][c] < min) {
                min = matrix[r][c];
                mc = c;
            }
        }
        List<Float> minList = minsMap.get(mc);
        if(minList == null) {
            minList = new ArrayList<>();
            minsMap.put(mc, minList);
        }
        minList.add(min);
    }
    for(Entry<Integer, List<Float>> e : minsMap.entrySet()) {
        System.out.println("Min values in column " + e.getKey() + ": " + e.getValue());
    }
}

出力

Min values in column 0: [2.0, 1.0]
Min values in column 2: [4.0, 5.0]
Min values in column 1: [5.0, 3.0]

リストは列インデックス順ではないことに注意してください。

于 2013-05-15T07:35:19.540 に答える