【问题标题】:How do I implement nested ArrayList?如何实现嵌套的 ArrayList?
【发布时间】:2011-05-06 18:59:55
【问题描述】:

我想实现一个看起来像这样的数据结构。

{{RowID, N1, N2, N3},
 {RowID, N4, N5, N6},
 {RowID, N7, N8, N9}}

然后继续。它基本上是一个具有 3 列和 RowID 的 Java 表。 我应该使用什么数据结构以及如何在代码中实现它?

【问题讨论】:

  • 你试过什么?您是否阅读过 Java 集合 API(提示:Map、HashMap、List、ArrayList)。

标签: java arrays multidimensional-array arraylist


【解决方案1】:

Java 提供列表转换,例如,您可以通过以下方式执行此操作:

ArrayList<List<someObject>> ArrayListOfLists = new ArrayList<List<someObject>>();

【讨论】:

    【解决方案2】:

    假设 RowID 是 long 并且列数据是 Doubles,我会将此构造实现为:

    import java.util.HashMap;
    import java.util.Map;
    ...
    Map<Long, Double[]> table = new HashMap<Long, Double[]>();

    要存储一行:

    Long rowID = 1234L;
    table.put(rowID, new Double {0.1, 0.2, 0.3});

    要访问一行: <pre>Double[] row = table.get(rowID);</pre>

    将 Double[] 替换为您想要的任何数据类型 Int[]、String[]、Object[] ...

    您可以使用迭代器遍历这些数据:

    import java.util.Iterator;
    import java.util.Map.Entry;
    ...
    Iterator<Entry<Long, Double[]>> iter = table.entrySet().iterator();
    while (iter.hasNext()) {
        Entry entry = iter.next();
        rowID = entry.getKey();
        row = entry.getValue();
    };

    要按插入数据的顺序迭代数据,请使用 LinkedHashMap 代替 HashMap。

    【讨论】:

    • 非常感谢。这对我帮助很大。
    【解决方案3】:

    制作一个由 ArrayList 组成的 ArrayList。例如:

    ArrayList<ArrayList> arrayListOfLists = new ArrayList<ArrayList>();
    arrayListOfLists.add(anotherArrayList);
    //etc...
    

    【讨论】:

    • 这是该问题的唯一准确答案。 +1
    【解决方案4】:

    您可以使用Map&lt;Integer, ArrayList&lt;MyObject&gt;&gt;,其中地图的键是您的 RowID。

    【讨论】:

      【解决方案5】:

      有多种选择。一种方法是声明一个代表一行的类。

       public class MyRow{
           private long rowId;
           private int col1;
           private int col2;
           private int col3;
           //etc
       }
      

      显然你选择了合适的数据类型和变量名。

      然后你可以创建一个这种类型的ArrayList:

         List<MyRow> rows = new ArrayList<MyRow>();
      

      如果列数不变,这将特别有用。

      【讨论】:

        【解决方案6】:

        我将创建一个包含每一行数据的 bean 对象。这比“嵌套的 ArrayList”有优势,因为数据成员是强类型的。

        接下来,我会将这些 bean 插入一个列表,可能是一个 LinkedList,除非您提前知道它们的数量。如果是这样,我会切换到 ArrayList。

        如果顺序不重要,您可以改用 HashSet 或 HashMap,具体取决于您是仅迭代它们(Set)还是需要按 RowID(Map)进行键查找。如果您使用其中一种数据结构,则需要为您的 bean 覆盖 equals()hashCode()

        【讨论】:

        • @Jeremy:虽然ArrayList 通常是首选List 实现,但当您不知道如何使用列表时,我不会说LinkedList 几乎总是一个坏主意。例如,如果您不打算对列表进行任何随机访问,而是要在列表中添加或删除元素,LinkedList 可能会更快。只需要知道每种类型的不同操作的相对成本以及您将要做什么。
        • @Jeremy:有参考资料吗?我很好奇。
        • @Jeremy:看看 Google 的 Jesse Wilson 的 blog postcorresponding microbenchmark,这表明在我描述的用例中,LinkedList 击败 ArrayList 是多么容易。
        • 我认为这里的核心问题是我们不知道提问者是如何使用数据结构的。有几种实现方式:除了链表/数组列表之外,散列集/映射也可能有用。没有更多信息,我们根本不知道。
        猜你喜欢
        • 1970-01-01
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        • 2023-03-15
        • 1970-01-01
        • 2021-09-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多