【问题标题】:Java - arraylist of multidimensional arrays or arraylist of multidimensional arraylists?Java - 多维数组的arraylist 或多维arraylist 的arraylist?
【发布时间】:2013-10-12 18:38:51
【问题描述】:

我正在学习 Java,并试图围绕这些数据结构进行思考。我来自 Python/PHP,所以我习惯于动态调整数组的大小,并能够在一个数组中存储多种数据类型。

如何最好地存储这些数据?假设我不知道我将拥有多少行,但我知道每行将包含 2 列数据。一列是字符串,另一列是双精度。

如果我有 3 行,则以伪代码为例:

array(array("description1", 10.00),
      array("description2", 12.00),
      array("description3", 14.00));

然后,我想循环遍历数组来处理数据,例如:

foreach(rows as row){
    myStringVal = row[0]; //on first iteration would be "description1"
    myIntVal = row[1];    //on first iteration would be 10.00
    ... do something with the values ...
}

我在想我需要创建一个包含数组的数组列表,但我不能在 java 数组中同时存储字符串和双精度值,那我该怎么办?我是否改用地图,并将其视为数组?例如,我是否创建一个映射,其中第一个元素是每行的数字 ID,第二个元素是字符串值,第三个元素是双精度值,然后我使用循环增加一个计数器并抓取每一行从使用数字 ID 的地图中>

真的很困惑这将如何工作。有什么建议么?谢谢!

【问题讨论】:

    标签: java arrays multidimensional-array arraylist


    【解决方案1】:

    您不是在存储“不同类型的值”,而是在存储对“元组”进行编码的语义数据,而是使用非 Java 概念将其粘贴到数组中。不要那样做,而是使用 C/C++/Java 将链接数据编码为结构/对象的概念:

    // our "struct"esque class for the linked data we're handling
    class MyObject {
      String description;
      float value;
      Public MyObject(String description, float value) {
        this.description = description;
        this.value = value;
      }
    }
    
    // build our list of objects
    ArrayList<MyObject> mylist = new ArrayList<MyObject>();
    mylist.add(new MyObject("description1", 10));
    mylist.add(new MyObject("description2", 12));
    mylist.add(new MyObject("description3", 14));
    ...
    
    // and then we iterate
    String d; float v;
    for(MyObject m: mylist) {
      d = m.description;
      v = m.value;
      ...
    }
    

    【讨论】:

    • 很好,也很喜欢这个答案。完全有道理。希望我能给出两个答案。
    • +1 “正确”的 Java 风格也可以实现 equals() and hashcode() 和 toString()。
    • 不适用于结构对象。只有当您打算进行匹配/散列时才需要equals和hashcode,在这种情况下我们不这样做(默认情况下它们是从Object继承的)
    【解决方案2】:

    看起来对我来说就像一个List&lt;Map&lt;String, BigDecimal&gt;&gt;

    • List 将使您能够连续输入多个元素。
    • Map 将为您提供String 和浮点值之间的关联,我选择了BigDecimal 来表示。如果你愿意,你可以使用Double

      List<Map<String, BigDecimal>> elements = new ArrayList<>();
      elements.add(new HashMap<String, BigDecimal>());
      elements.get(0).put("description1", BigDecimal.valueOf("10.00"));
      

    【讨论】:

    • 谢谢,我会选择这个作为答案,但我也喜欢 Mike 'Pomax' Kamerman 的答案......这可能是更好的方法,但我只是在寻找现在是快速/肮脏的方式。希望我能给两个答案打勾。
    • 公平地说,您可以这样做,但值得注意的是 Java 方式,其中正确的 OOP 方法是将任何表示“事物”的事物编码为对象。鉴于这个问题,这听起来像是一个不错的解决方案,但考虑到预期的程序行为,它有点不是 =)
    • @Mike 是的,我绝对同意。有点糟糕的是,我必须跟上我所在的课程,而且它需要以“错误”的方式做事,但它迫使我们很好地学习数据结构。我过去曾因使用尚未在课堂上教授的技巧而失分,所以我现在要坚持这个想法。
    • 只要记住 S.O.不是关于你的家庭作业,而是关于获得问题的正确答案。如果您标记“错误”答案是正确的答案,因为您的班级教错了,请注意未来的 SO 访问者可能会使用此线程来指导他们的编程。您不仅在接受自己的答案,还在指导未来访问者的教育 =)
    • 没错,翻了。谢谢大家,很有帮助。
    【解决方案3】:

    使用类而不是数组。

    public class X
    {
        private final String description;
        private final double value;
    
        public X(final String desc,
                 final double val)
        {
            decription = desc;
            value      = val;
        }
    
        // getters
    }
    

    如果您希望能够更改描述和值,请不要将它们定为最终版本。

    您可以公开 descriptionvalue 变量,但我会避免这种诱惑。

    【讨论】:

      猜你喜欢
      • 2013-09-21
      • 2017-08-20
      • 1970-01-01
      • 2017-04-08
      • 2019-01-25
      • 2014-12-21
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多