【问题标题】:representing a matrix with column/row labels表示具有列/行标签的矩阵
【发布时间】:2018-12-06 01:43:05
【问题描述】:

我想用 Java 创建一个二维数组,或者一个带有 int 数字的矩阵。

我已经这样做了..但我仍然不知道如何为行/列分配标签。

我希望能够根据行/列访问矩阵内的任何数字

这是我的java代码

 Gson gson = new Gson();
    int[][] data = {{78, 0, 0, 0, 0}, {0, 54, 0, 0, 0}, {0, 0, 12, 0, 0}, {0, 0, 0, 74, 0}, {0, 0, 0, 0, 11}};
    String json = gson.toJson(data);

    // Convert JSON string into multidimensional array of int.
    int[][] dataHeatMap = gson.fromJson(json, int[][].class);
    for (int[] i : dataHeatMap) {
        for (int j : i) {
            System.out.print(j + " ");
        }
        System.out.println("");
    }
    return json;

【问题讨论】:

  • 标签是什么意思?例如,您希望以 [b][h] 形式而不是 [1][2] 形式访问数据?
  • 确实希望能够根据行/列访问矩阵内的任何数字
  • 不能用数字代替字母有什么原因吗?
  • 嘿 Kepotx,是的,因为这些标签存储在数据库中,需要检索值。我仍然可以映射它们..但如果有办法直接使用标签会更好

标签: java arrays matrix


【解决方案1】:

你可以使用Enums:

public enum ROW {a, b, c, d, e}
public enum COL {f, g, h, i, j}

data[ROW.a.ordinal()][COL.f.ordinal()] = 3;

【讨论】:

  • 您的枚举类型不能代表设置索引所需的int。枚举需要获得一个代表索引的文件。 a=0, b=1,..
  • 已修复。每个枚举都有一个序号
  • 我知道,但我更喜欢更好的可读性和自定义的方式。但你是对的。 +
  • 好吧,我不知道。 Java 已经太冗长了。详细!=可读
【解决方案2】:

使用代表 2dim 数组的特殊索引的 ENUM 类型。给它们一个名为value/name/... 的字段,并使用它们在数组中的索引创建它们。之后,您可以通过获取代表数组索引的字母值来轻松调用它们。

它非常易读,ENUM.<VALUE> 不代表 INT 值。所以这就是你可以做到的方式。

public enum ROW {
        A(0), B(1), C(2), D(3), E(4);

        private final int value;
        ROW(int value) { this.value = value; }
        public int getValue() { return value; }
    }

    public enum COL {
        F(0), G(1), H(2), I(3), J(4);

        private final int value;
        COL(int value) { this.value = value; }
        public int getValue() { return value; }
    }

    public static void main(String []args){
        int[][] matrix = {{78, 0, 0, 0, 0}, {0, 54, 0, 0, 0}, {0, 0, 12, 0, 0}, {0, 0, 0, 74, 0}, {0, 0, 0, 0, 11}};
        System.out.println("Value: " + matrix[ROW.A.getValue()][COL.F.getValue()]);
    }

我更喜欢上面的方式,因为您可以看到直接发生的事情并且可以分配您想要的任何值。但是你也可以使用 ENUM.ordinal()。 然后data[ROW.a.ordinal()][...] 将为 ROW 返回 0,因为它首先列出。 b 将返回 1,... 这仅取决于它们在 ENUM 上列出/创建的方式。

【讨论】:

  • 不需要 int 值。每个枚举都有一个隐含的 int 序数值
  • 您的回答并未在我提供的信息中添加任何新信息。这是我的答案的重复
  • @SharonBenAsher 它清楚地显示了这两种解决方案之间的区别,并提供了描述/示例。几年后,发展中的业务后端我真的知道所有 PO/Devs 都希望它是第一种方式。它更具可读性,无需文档即可清晰理解,并且可 100% 扩展/自定义。
  • Java 开发人员应该知道enum 的工作原理以及这种语言结构的功能。向枚举添加自定义序数值简直是多余的,并提出了一个问题,为什么需要它而不是语言特性。
  • @SharonBenAsher 但是如果您想将它们称为“A”或 100 200 而不是 0、1、.. 怎么办?有了自己的新领域,很容易实现这个目标。它经常被使用,并没有太多理解/更多的工作来做到这一点。对我来说,这并不重要 - 两者都在工作。
猜你喜欢
  • 2011-09-27
  • 2021-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-25
  • 2020-07-13
  • 2013-07-25
  • 1970-01-01
相关资源
最近更新 更多