【问题标题】:How do you save one line into a linkedlist and next line into another list when reading from file从文件读取时如何将一行保存到链接列表中,并将下一行保存到另一个列表中
【发布时间】:2015-07-18 20:50:07
【问题描述】:

我想从一个文件中读取并将每一行存储到一个单独的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);
    }
}

【问题讨论】:

  • 也许是numbers[i] 而不是numbers[0] ?
  • 好的,希望编辑有助于澄清我的问题,而安东尼奥我的意思是,我只是忘记了它。感谢你们的 cmets 伙计们
  • 听起来您还没有从您对我的回答和乔伊的回答的评论中完全描述您的问题陈述。您能否请edit您的问题明确说明您要做什么?

标签: java split linked-list bufferedreader filereader


【解决方案1】:

如果我的理解正确,您似乎希望成对排列您的列表。这是最简单的方法,但不一定是最好的:

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 NumberPair {
    LargeNumber firstNumber;
    LargeNumber secondNumber;
}

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

【讨论】:

  • 这不是要添加一个以“,”分隔的所有数字的链表,并将它们全部存储到“列表”中吗?这没有回答我的问题。如果我错了,对不起,我还是个菜鸟。
  • 它将创建与文件中的行数一样多的LargeNumber 实例。这是一个列表列表。把它想象成一个杂货清单的记事本,每一页都是它自己的清单,然后整个便笺簿就是“外部”清单。自己试试吧!覆盖 LargeNumber 类中的 toString() 方法以显示内容,然后覆盖 System.out.println() List&lt;LargeNumber&gt;
  • 我知道你的代码是如何工作的,但我想要分隔名称的原因是我会在 2 个链表之间应用数学运算。 @joeyrohan
  • 非常感谢@durron597
【解决方案2】:

您可以使用 List&lt;LargeNumber&gt; 代替 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 :))

【讨论】:

    【解决方案3】:

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

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

    我的例子假设你不知道会有多少行。

    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());
        }
    }
    

    【讨论】:

    • 你怎么知道行数?此外,他可能必须使用他的LargeNumber
    • 只需将链表中的Integer 更改为LargeNumber 然后:)
    • 糟糕,我刚刚意识到 lineNum++; 在 for 循环中......不应该是这样。已在编辑中修复。
    【解决方案4】:

    您可以将您的类对象存储到任何合适的集合中。例如

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

    添加你的对象:

    list.add(num);
    

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

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

    【讨论】:

    • 如果有两个以上的数字怎么办?
    • 这个答案是针对特定用户问题的。OP只提到了2个列表@durron597
    • 他说“存储每一行​​”;这两行只是一个例子。
    • 是的,谢谢@durron597 是正确的。我有很多行数字,每两行后面都有空格,所以我必须一次读取两行并将每一行存储到一个单独的链表中
    猜你喜欢
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 2018-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多