【问题标题】:How to implement 2D list?如何实现二维列表?
【发布时间】:2013-05-15 07:04:21
【问题描述】:

我有一个包含r 行和c 列的矩阵。我已将矩阵存储在二维数组中。见下图。

我在每一行中找到最小数量。如果最小值位于第一列,我将最小值添加到 listC1。

考虑上图。

在第一行 R1 中,最小数字是 2,它位于 C1 列中,我想在 listC1 中添加 2。 在第二行 R2 中,最小数字是 4,它位于 C3 列中,我想在 listC3 中添加 4。在第三行 R3 最小数字是5,它位于 C2 列我想在listC2 中添加 5。简而言之,如果最小数量在第一列,我将在第一列中添加最小数量listC1,如果最小数量在第二列,我将在第二列中添加最小数量listC2,如果最小数量在第三列我将在第三个列表中添加最小数量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());
        }

【问题讨论】:

  • 你的意思是“它不能正常工作”?它具体做什么/不做什么?
  • 你可以先初始化并添加所有空的嵌套组,然后使用group.get(atIndex).add(minValue);
  • 你可以看看 Guava 的Table
  • @user1703737 从地图中获取列表并向其添加最小值的代码需要在循环for(int row=0; row &lt; matrix.length; row++) 之外,即将该循环的右大括号移动到ArrayList&lt;Float&gt; minList = minsMap.get(mc); 上方然后它会工作。

标签: java arrays list arraylist


【解决方案1】:

nestedGroup 仅在 an 用于所有列时才被初始化。这是不正确的,您需要为每一列设置一个嵌套组。

看看这段代码,它使用Map 来保存最小值列表。

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]

请注意,列表不按列索引排序。

【讨论】:

  • 第 0 列的最小值:[2.0, 2.0, 2.0, 9.0, 8.0, 7.0, 1.0, 1.0, 1.0, 8.0]
  • 第 1 列的最小值:[7.0, 5.0, 5.0, 3.0, 3.0, 7.0]
  • 第 2 列中的最小值:[4.0, 5.0]
  • @user1703737 for 女巫输入 你得到上面的结果了吗?您可以将您的输入和预期结果作为编辑发布在您的问题中吗?
  • 亲爱的!我的输入是您在回答中提到的二维矩阵数组
猜你喜欢
  • 2012-12-28
  • 1970-01-01
  • 1970-01-01
  • 2017-11-09
  • 2019-07-25
  • 2014-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多