2D 数组无法正确打印(或填充)



在我的主类中,我循环遍历120个文件。对于每个文件,我创建一个2d数组,其中包含的数据。

我的2d数组是类型为List<List<String>>的"fullData"。ParserIPAM是一个继承类,我在它的超类中声明了fullData。

这是我在main中的代码:
for(String filename : filefetcher.getFiles()){
            System.out.println("file to parse: "+ filename);
            ipam = new ParserIPAM(filename);
            i=0;
            boolean flag = true;
            System.out.println("------------------------------------------");
            for(List<String> row : ipam.getSqlData()){
                //queries.insertVars(row);
                //System.out.println(row);
            }
            //System.out.println(i);
            ipam.clearSqlData();
        }

这里是我填充2d数组的代码:

public ParserIPAM(String filename){
        super(filename);
        try {
            Parse(filename);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        SpecialOperations(fullData);
        //System.out.println("+++++++++++++++++++++++++++++++++++"+ls2d.size());
    }
    @Override
    void Parse(String filename) throws FileNotFoundException{
        fullData.clear();
        FileReader input = new FileReader(filename);
        ArrayList<String> Raw = new ArrayList<String>();
        BufferedReader bufRead = new BufferedReader(input);
        Scanner bufferinput = new Scanner(bufRead);
        String nextline = bufferinput.nextLine();
        int i = 0;
        while(bufferinput.hasNext()){
            Raw.clear();
            nextline = bufferinput.nextLine();
            for(String cell: nextline.split(",(?=([^"]*"[^"]*")*[^"]*$)")){
                Raw.add(cell);              
                //System.out.print(i+"    "+cell);  ////// THIS PRINTS CORRECT DATA         
            }
            i++;
            //System.out.println(i + "    " + Raw); ////THIS PRINTS CORRECT DATA
            fullData.add(Raw);
        }
        for(List<String> sub: fullData){
                //System.out.println(sub); ///THIS DOES NOT PRINT CORRECTLY
        }
    }
编辑:ParserIPAM是一个继承类。下面是这个超类的完整代码:
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
public abstract class Parser {
    protected static String filename;
    //private List<List<String>> dataArray = new ArrayList<ArrayList<String>()>();
    protected List<List<String>> fullData = new ArrayList<List<String>>();
    public Parser(String filename){
        //this.filename = filename;
    }
    //Parse will only parse file and put raw data into a 2d ArrayList.
    abstract void Parse(String filename) throws FileNotFoundException;
    //SpecialOperations will add additional data to raw data for table insertions.
    abstract void SpecialOperations(List<List<String>> data);

}

当我在最后一个系统中打印所有内容时。输出正确的元素数(256),但它总是在一行中输出文件的最后一行256次。我不确定我是否填错了数组或者我是否打印错了。无论哪一种都是错的,我似乎也弄不明白。

我知道可能有比ArrayList更好的方法,但这并没有影响我遇到的问题

您只创建一个ArrayList实例(并在循环中清除它),因此您只添加了一个引用(只是多次)。对于Java 7及以上版本,我能想到的最简单的解决方案是使用new ArrayList<>()菱形运算符代替-

// Raw.clear();
Raw = new ArrayList<>();

对于Java 6和5,

// Raw.clear();
Raw = new ArrayList<String>();

同样,你也可以用-

// fullData.add(Raw);
fullData.add(new ArrayList<>(Raw)); // <-- copies Raw

尝试将Raw的实例化放入While循环

while(bufferinput.hasNext()){
        ArrayList<String> Raw = new ArrayList<String>();
        Raw.clear();
        nextline = bufferinput.nextLine();
        for(String cell: nextline.split(",(?=([^"]*"[^"]*")*[^"]*$)")){
            Raw.add(cell);              
            //System.out.print(i+"    "+cell);  ////// THIS PRINTS CORRECT DATA         
        }
        i++;
        //System.out.println(i + "    " + Raw); ////THIS PRINTS CORRECT DATA
        fullData.add(Raw);
    }

相关内容

  • 没有找到相关文章

最新更新