从文件读取时如何将一行保存到链表中并将下一行保存到另一个列表中

How do you save one line into a linkedlist and next line into another list when reading from file

我想从一个文件中读取并将每一行存储到一个单独的文件中 LinkedList 但我不知道该怎么做,因为我正在使用拆分功能。

文字是这样的:

124,53,7,2

1,2,34,567,23

因此将第一行存储到 LinkedList 中,将第二行存储到另一个 LinkedList 中。

ex:num1 持有 124, 53, 7, 2 个节点
num2 拥有 1, 2, 34, 567, 23 个节点

if(args.length == 0)
    System.out.println("No file specified.");
else{
    FileReader theFile;
    BufferedReader inFile;
    String oneLine;
    int s;

    try{
        theFile = new FileReader(args[0]);
        inFile = new BufferedReader(theFile);
        LargeNumber num1 = new LargeNumber();
        LargeNumber num2 = new LargeNumber();
        while((oneLine = inFile.readLine()) != null){
            String numbers[] = oneLine.split(",");
            s = 0;
            for(int i = 0; i < numbers.length; i++){
                num1.push(Integer.parseInt(numbers[i]));
            }
            if((inFile.readLine()).length()==0){
                continue;
            }
        }
    }
    catch(Exception e){
        System.out.println(e);
    }
}

如果我没有理解错的话,你似乎想将列表成对排列。这是最简单的方法,但不一定是最好的方法:

List<LargeNumber> firstList = new ArrayList<>();
List<LargeNumber> secondList = new ArrayList<>();
try{
    theFile = new FileReader(args[0]);
    inFile = new BufferedReader(theFile);
    while(inFile.ready()){
        String firstLine = getNonEmptyLine(inFile);
        if(firstLine.isEmpty()) break;
        String secondLine = getNonEmptyLine(inFile);
        if(secondLine.isEmpty()) break;
        firstList.add(makeLargeNumber(firstLine));
        secondList.add(makeLargeNumber(secondLine));
    }
}
catch(Exception e){
    System.out.println(e);
}

这是 readNonEmptyLine() 方法:

private String readNonEmptyLine(BufferedReader reader) {
     while(reader.ready()) {
          String nextLine = reader.readLine();
          if(!nextLine.isEmpty()) return nextLine;
     }
     return "";
}

这里是 makeLargeNumber 方法:

private LargeNumber makeLargeNumber(String line) {
    LargeNumber num1 = new LargeNumber();
    String numbers[] = oneLine.split(",");
    s = 0;
    for(int i = 0; i < numbers.length; i++){
        num1.push(Integer.parseInt(numbers[i]));
    }
    return num1;
}

这会起作用,但如果有这样的 class 会更好:

class NumberPair {
    LargeNumber firstNumber;
    LargeNumber secondNumber;
}

然后只有一个 List 而不是两个。我想你可以弄清楚如何修改上面的代码以使用 NumberPair class.

您可以使用 List<LargeNumber> 代替 num1、num2、num3 等。

所以它看起来像这样:

List<LargeNumber> myNumbers = new ArrayList();
try ( ... ) {
    String line;
    while((line = ...readLine()) != null) {
        LargeNumber number = new LargeNumber();
        for(part : line.split(...)){
            number.push(Integer.parseInt(part));
        }
        myNumbers.add(number);
    }
}

如果您只想拥有 n 个数字(例如 n=2、num1 和 num2)并且您希望在两者之间交替,请改用数组。

LargeNumber[] myNumbers = new LargeNumber[n];
for(int i = 0; i < myNumbers.length; i++) myNumbers[i] = new LargeNumber();
try ( ... ) {
    String line;
    int i = 0;
    while((line = ...readLine()) != null) {
        LargeNumber number = myNumbers[i%myNumbers.length];
        for(part : line.split(...)){
            number.push(Integer.parseInt(part));
        }
        i++;
    }
}

别忘了关闭您的读者! (只需使用 try-with-resouces :))

您可以将 class 对象存储到任何合适的 collection.Eg

 List<LargeNumber> list=new ArrayList<LargeNumber>;

添加您的对象:

list.add(num);

您可以使用 for-each 循环获取值:

for(LargeNumber l:list)
  l.method()//...

如果您已经知道行数,则可以创建一个列表数组,其中数组的大小就是行数。然后您将使用行号来确​​定要使用的列表。

如果您不知道会有多少行,请创建一个列表列表。

我的示例假设您不知道会有多少行。

List<LinkedList<Integer>> lists = new ArrayList<LinkedList<Integer>>();

//BufferedReader stuff...

int lineNum = 0;
while ((line = reader.readLine()) != null)
{
    try
    {
        LinkedList<Integer> numbers = new LinkedList();
        String[] components = line.split(",");
        for (String s : components)
        {
            numbers.add(Integer.parseInt(s));
        }
        lineNum++;
        lists.add(numbers);
    } catch(Exception e)
    {
        System.err.println("An error has occured: " + e.getMessage());
    }
}