ArrayList<ArrayList<String>> 转为 String[][]

3
看起来JTable构造函数喜欢String[][],但在我必须使用其他东西之前,我喜欢使用更智能的容器。一直在使用ArrayList<ArrayList<String>>,现在我需要让JTableString[][]兼容。
我找到了一个非常简单的方法,可以使用toArray()ArrayList<String>转换为String[],但是没有找到多维数组的简单转换器。
我想以最少的行数从ArrayList<ArrayList<String>>转换为String[][]
我一直在搜索库,似乎找不到这个转换器,希望有人能提供一个好的解决方案。
提前致谢。

我建议您使用 List<List<String>> matrixString。我的意思是,您应该使用 List 而不是 ArrayList 来声明变量。Robert Rouhani的答案也很好。 - user1373996
两个答案都很好,让我很难选择哪一个是正确的答案。 - Bruce Chidester
2个回答

7

ArrayList<ArrayList<String>> 不是在内存中连续的。第二个数组列表存储对ArrayList<String>的引用的数组,而在每个这些 ArrayList 中,可能会有一个比您放入其中的项目数更大的数组。

因此,唯一真正的方法是通过迭代来完成:

ArrayList<ArrayList<String>> data;

//...

String[][] converted = new String[data.size()][];
for (int i = 0; i < converted.length; i++)
    converted[i] = data.get(i).toArray(new String[data.get(i).size()]);

ToArray() 应该改为 toArray(new String[data.get(i).size()]) - Eng.Fouad
糟糕!我就知道会遇到这样的问题。我已经好几个月没碰Java了,转而使用C#...(我差点把.size()写成了.Count - Robert Rouhani
2
另一种方法是:converted[i] = new String[data.get(i).size()]; - data.get(i).toArray(converted[i]); - Eng.Fouad
你提醒了我关于非连续内存存储的问题...而且有了解决方案,我认为这是一个非常好的答案。 - Bruce Chidester

6

您可能需要考虑实现自己的表格模型: JTable(TableModel dm)

您可以创建一个继承AbstractTableModel并委托给List或任何其他合适的数据结构的类。


+1 同意;这里有一个相关的例子:链接 - trashgod
尽管您没有展示如何转换数据,但您的答案指引了我一个更好的方向,因此我认为您的回答是最佳的。 - Bruce Chidester

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接