【问题标题】:While and for loops for adding to two dimensional array用于添加到二维数组的 while 和 for 循环
【发布时间】:2013-02-28 09:38:34
【问题描述】:

我有一个包含对象的数组列表。每个对象包含许多字符串。我正在尝试将这些字符串添加到二维数组中。

public void iterateRow(Row row)
{ 
    int x = 0;
    int y = size();
    tableArray = new String[y][5];
    while(x < y){
       int z = 0;
       for (String s: row.rowString()){
          tableArray[x][z] = s;
          z++;
       }
       x++;
    }
}

每当我运行并为行类创建一个新实例时,该方法都应将包含在 Row 中的字符串添加到数组中。但是,它将最新条目复制 x 次(其中 x 是条目总数)。

这里是 Row 类供进一步参考:

public class Row
{   
public String appNumber;
public String name;
public String date;
public String fileLoc;
public String country;
public String elementString;
public String results[];

public Row(String appNumber, String name, String date, String fileLoc, String country, Table table)
{
    this.appNumber = appNumber;
    this.name = name;
    this.date = date;
    this.fileLoc = fileLoc;
    this.country = country;
    table.addApplicant(this);
}

public String[] rowString()
{
    String[] a = {appNumber, name, date, fileLoc, country};
    return a;
}}

我认为在 iterateRow() 方法中这是一个愚蠢的逻辑错误,但我似乎无法弄清楚是什么。任何帮助将不胜感激。

编辑:在大家的帮助下,我删除了 while 循环。然而,它似乎仍然是复制行而不是移动到下一个?

public void iterateRow(Row row)
{ int x = 0;
    int y = size();
    tableArray = new String[y][row.rowString().length];
    for(int i =0; i<y;i++){
    int z = 0;
    for (String s: row.rowString()){
       tableArray[x][z] = s;
       z++;
    }x++;}
} 

【问题讨论】:

  • size() 返回什么?因为您将同一行 rowString() 元素添加到您的数组 "size()" 次。
  • 根据您的循环,由于参数“行”永远不会改变,您构建数组的源将来自此“行”。我想在你的'for each'循环之后你想去下一行吗?......而且,你的while循环可以简化为'for'循环。
  • 这里为什么是 5,tableArray = new String[y][5] ?
  • 因为Row中有5个String字段。
  • @Machinegon 好声音。我已将其更改为 tableArray = new String[y][row.rowString().length];

标签: java arrays object arraylist add


【解决方案1】:

您似乎想要遍历行列表的每个元素

也许您想使用类似于以下的方法:

public void iterateRows(List<Row> rows) {
    int cols = 5;
    int row = 0, col = 0;
    tableArray = new String[rows.size()][cols];
    for(Row row : rows) {
        col = 0;
        for(String c : row.rowString()) {
            tableArray[row][col] = c;
            col++;
        }
        row++:
    }
}

但是,如果列数超过 5 列,最好实现自己的错误检查...

编辑

这可能不是用于您的程序的最佳设计,我建议您更改它,以便在添加新行时,您不必遍历每个旧行。

【讨论】:

    【解决方案2】:

    我不知道这是否出于实际目的或如何调用 IterateRow(),但实现此工作的合乎逻辑的方法是首先声明数组,在 IterateRow 中添加 2 个参数(数组的引用和 currentRow )。然后,在 iterateRow 中,你摆脱了 while 循环,你只需要循环字符串属性。

    【讨论】:

      【解决方案3】:

      问题似乎出在 while 循环中。例如,如果 size() 返回 3,则 while 循环将以 x=0,1,2 执行,因此您将分配 tableArray[0],然后是 tableArray[1],然后是 tableArray[2]。

      很难说出解决方案是什么,因为我完全不明白为什么你的代码中有 while 循环。

      【讨论】:

        【解决方案4】:

        您没有注意相对于 Row 的大小来调整二维数组的大小。

        虽然这可能不是确凿的证据,但这样做会更安全

         tableArray = new String[y][row.rowString().length];
        

        而不是

         tableArray = new String[y][5];
        

        【讨论】:

        • 谢谢你,以后在 Row 类中添加更多元素时会派上用场:)
        【解决方案5】:

        您的iterateRow 方法在每次调用时都会重新创建tableArray。由于while 循环,您的Row 对象在数组中被复制y 次。

        我怀疑您想在 iterateRow 方法之外创建数组,而不是使用 while 循环(只是 for 循环)来填充数组中的下一个槽。

        【讨论】:

        • 每次调用它都会同时执行。它使用tableArray = new String[y][5]; 重新创建数组,while 循环重复行。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-02
        • 1970-01-01
        • 2016-06-28
        相关资源
        最近更新 更多