【问题标题】:BufferedReader reading each newline a commaBufferedReader 读取每个换行符一个逗号
【发布时间】:2014-12-11 16:44:34
【问题描述】:

我的代码假设读取一个文件,其中整数由换行符分隔并反向打印出来。我的代码只有在整数在第一行时才有效,但如果整数由新行分隔,它会给出这个

正在打开文件...

文件已打开 逆序前 [5 12 3 5 4 , 0]
逆序后 [ 4 5 3 21 5, 0]

用包含这个的文件

5 12 3 5 4
0

如何让我的代码改为显示:0 4 5 3 21 5

下面是我的代码

public static void main(String[] args) throws Exception {

    String line =null;
    ArrayList<StringBuilder> arrayList = new ArrayList<StringBuilder>();
    System.out.println("Opening file... \n");
    try 
    {
        BufferedReader in = new BufferedReader(new FileReader(new File("file.txt")));
        System.out.println("File opened");

        while((line = in.readLine()) != null && line.length()!= 0)  {
            //String[] input = line.split(" ");
            arrayList.add(new StringBuilder(line));
        }
        in.close();


        System.out.println("Before Reverse Order " + arrayList);

        for(int i = 0; i < arrayList.size(); i++) {
              arrayList.get(i).reverse();
    }

        System.out.println("After Reverse Order " + arrayList);
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
}

【问题讨论】:

    标签: java arraylist bufferedreader


    【解决方案1】:

    您忘记反转 arrayList 本身。您只需反转每个 StringBuilder。

    Collections.reverse(arrayList);
    

    无论如何,列表似乎根本没有用。只需直接附加到 StringBuilder。像这样的东西应该可以解决问题:

    // ...
    StringBuilder sb = new StringBuilder();
    while((line = in.readLine()) != null && line.length()!= 0)  {
        sb.append(line);
    }
    in.close();
    
    System.out.println(sb.reverse().toString());
    
    // ...
    

    【讨论】:

    • 谢谢,我想我根本不需要 ArrayList。
    • 如果不附加空格,则连续两行不会有任何分隔符
    【解决方案2】:

    只使用一个StringBuilder,在每行之间添加一个空格:

    public static void main(String[] args) throws Exception {
    
        String line =null;
        StringBuilder s = new StringBuilder();
        System.out.println("Opening file... \n");
        try 
        {
            BufferedReader in = new BufferedReader(new FileReader(new File("file.txt")));
            System.out.println("File opened");
    
            while((line = in.readLine()) != null && line.length()!= 0)  {
               s.append(line);
               s.append(" ");
            }
            in.close();
    
    
            System.out.println("Before Reverse Order " + s);
    
            s.reverse();
    
            System.out.println("After Reverse Order " + s);
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
    

    它给出了:

    Opening file... File opened Before Reverse Order 5 12 3 5 4 0 After Reverse Order 0 4 5 3 21 5

    【讨论】:

    • try/catch-block 很重要。 in.close() 应该在 finally-block 中完成。
    • 我同意,我使用了OP代码,我没有修改这部分
    【解决方案3】:

    lupz 的回答是正确的。在arrayList.get(i).reverse(); 之前或之后添加Collections.reverse(arrayList);

    完整的文件在这里:

    import java.io.*;
    import java.util.*;
    public class test {
    
    public static void main(String[] args) throws Exception {
    
        String line =null;
        ArrayList<StringBuilder> arrayList = new ArrayList<StringBuilder>();
        System.out.println("Opening file... \n");
        try 
        {
            BufferedReader in = new BufferedReader(new FileReader(new File("file.txt")));
            System.out.println("File opened");
    
            while((line = in.readLine()) != null && line.length()!= 0)  {
                //String[] input = line.split(" ");
                arrayList.add(new StringBuilder(line));
            }
            in.close();
    
    
            System.out.println("Before Reverse Order " + arrayList);
    
            for(int i = 0; i < arrayList.size(); i++) {
                  arrayList.get(i).reverse();
        }
        Collections.reverse(arrayList);
    
            System.out.println("After Reverse Order " + arrayList);
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
    }
    

    【讨论】:

      【解决方案4】:

      我假设您有一个包含许多行的文件,其中每行可以包含用空格分隔的整数。在这种情况下,我会使用 split 函数来获取每一行的整数。我还假设您不需要检查文件中的值是否实际上是整数。否则你将不得不使用 Integer.parseInt(String p)。您可以使用 ArrayList arrayList = new ArrayList 来跟踪所有整数。然后对每一行使用arrayList.addAll(Arrays.asList(line.split(" "))。假设每个整数只用一个空格分隔。那么最后你可以反转arraylist。

      【讨论】:

        【解决方案5】:

        不要使用 readLine。您可以使用 read() 函数。它给出了字符。您可以手动检查“\n”或“”字符。一行:

         int c = r.read();
            while (c != -1){
                char ch = (char)c;
                if (ch == '\n' || c == ' '){
                    String num = buf.toString().trim();
                    if (num.length() > 0){
                        arrayList.add(new StringBuilder(num));
                    }
                    buf.delete(0, buf.length());
                } else {
                    buf.append(ch);
                }
                c = r.read();
            }
            String num = buf.toString().trim();
            if (num.length() > 0){
                arrayList.add(new StringBuilder(num));
            }
        

        你也应该打电话给Collections.reverse(arrayList);

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-06-10
          • 1970-01-01
          • 1970-01-01
          • 2017-08-19
          • 1970-01-01
          • 2022-12-22
          • 1970-01-01
          • 2013-05-17
          相关资源
          最近更新 更多