【问题标题】:Java nested list to array conversionJava 嵌套列表到数组的转换
【发布时间】:2010-09-27 04:13:07
【问题描述】:

将数据从嵌套列表转换为对象数组(可用作 JTable 的数据)的最有效方法是什么?

List<List> table = new ArrayList<List>();

for (DATAROW rowData : entries) {
    List<String> row = new ArrayList<String>();

    for (String col : rowData.getDataColumn())
        row.add(col);

    table.add(row);
}

// I'm doing the conversion manually now, but
// I hope that there are better ways to achieve the same
Object[][] finalData = new String[table.size()][max];
for (int i = 0; i < table.size(); i++) {
    List<String> row = table.get(i);

    for (int j = 0; j < row.size(); j++)
        finalData[i][j] = row.get(j);
}

非常感谢!

【问题讨论】:

    标签: java arrays list jtable


    【解决方案1】:
    //defined somewhere
    List<List<String>> lists = ....
    
    String[][] array = new String[lists.size()][];
    String[] blankArray = new String[0];
    for(int i=0; i < lists.size(); i++) {
        array[i] = lists.get(i).toArray(blankArray);
    }
    

    我对JTable一无所知,但是将列表列表转换为数组只需几行即可。

    【讨论】:

      【解决方案2】:

      特别是对于JTable,我建议像这样子类化AbstractTableModel

      class MyTableModel extends AbstractTableModel {
          private List<List<String>> data;
          public MyTableModel(List<List<String>> data) {
              this.data = data;
          }
          @Override
          public int getRowCount() {
              return data.size();
          }
          @Override
          public int getColumnCount() {
              return data.get(0).size();
          }
          @Override
          public Object getValueAt(int row, int column) {
              return data.get(row).get(column);
          }
          // optional
          @Override
          public void setValueAt(Object aValue, int row, int column) {
              data.get(row).set(column, aValue);
          }
      }
      

      注意:这是可能的最基本的实现;为简洁起见,省略了错误检查。

      使用这样的模型,您不必担心无意义的转换为Object[][]

      【讨论】:

      • 好答案。但是,请仔细检查传递给此模型的数据是否在其他地方不可见,并且容易被忍者编辑。可能不是,但如果是,可能需要在此处克隆。
      • 好点。我想到了这一点,但 DefaultTableModel 实际上也不检查(它使用向量)。无论如何,这是可能的最基本的实现。 ;)
      【解决方案3】:

      Java 11 答案。

      List<List<String>> table = List.of(List.of("A", "B"), List.of("3", "4"));
      String[][] finalData = table.stream()
              .map(arr -> arr.toArray(String[]::new))
              .toArray(String[][]::new);
          
      System.out.println(Arrays.deepToString(finalData));
      

      [[A, B], [3, 4]]

      Collection.toArray​(IntFunction&lt;T[]&gt; generator) 方法是 Java 11 中的新方法。

      当然,您也可以在 Java 8+ 中使用流。只需使用此映射即可:

      .map(arr -> arr.toArray(new String[0]))
      

      List.of 方法是在 Java 9 中引入的。)

      【讨论】:

        【解决方案4】:

        要将嵌套列表转换为二维对象数组,可以使用以下代码:

        public Object[][] ToObjectMatrix(List<List<String>> data) throws IllegalArgumentException {
            if(data == null) {
                throw new IllegalArgumentException("Passed data was null.");
            }
        
            Object[][] result = new Object[data.size()][];
             
            for(int i = 0; i < data.size(); i++) {
                result[i] = data.get(i).toArray();
            }
             
            return result;
        }
        

        【讨论】:

          猜你喜欢
          • 2012-06-03
          • 1970-01-01
          • 2018-12-24
          • 2020-01-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-02
          • 2020-10-06
          相关资源
          最近更新 更多