制表符分隔的文件:

2019-06-06 10:00:00 1.0
2019-06-06 11:00:00     2.0


我想遍历文件一次,并将每列的值添加到列表中。

我的工作方法是:

import java.util.*;
import java.io.*;

public class Program {
public static void main(String[] args)
{
ArrayList<Double> List_1 = new ArrayList<Double>();
ArrayList<Double> List_2 = new ArrayList<Double>();

String[] values = null;
String fileName = "File.txt";
File file = new File(fileName);
try
    {
    Scanner inputStream = new Scanner(file);
    while (inputStream.hasNextLine()){
        try {
        String data = inputStream.nextLine();
        values = data.split("\\t");
        if (values[1] != null && !values[1].isEmpty() == true) {
            double val_1 = Double.parseDouble(values[1]);
            List_1.add(val_1);
            }
        if (values[2] != null && !values[2].isEmpty() == true) {
            double val_2 = Double.parseDouble(values[2]);
            List_2.add(val_2);
            }
        }
        catch (ArrayIndexOutOfBoundsException exception){
        }
        }
        inputStream.close();
        }
catch (FileNotFoundException e) {
    e.printStackTrace();
}
System.out.println(List_1);
System.out.println(List_2);
}
}


我得到:

[1.0]
[2.0]


如果没有对nullìsEmptyArrayIndexOutOfBoundsException进行检查,则无法使用。

我希望您能在保持扫描仪方法的同时节省一些行的任何提示。

最佳答案

您可以使用try-with resources为您打开和关闭Scanner来清理代码:

try (Scanner inputStream = new Scanner(file))
{
//your code...
}


这很有用,因为一旦离开inputStream块,就会自动关闭try,并且您无需使用inputStream.close();手动将其关闭。

另外,如果您确实要“保存线条”,则还可以组合以下步骤:

double val_2 = Double.parseDouble(values[2]);
List_2.add(val_2);


由于您实际上并未在其他任何地方使用val_2,因此每个步骤都需要执行以下操作:

List_2.add(Double.parseDouble(values[2]));


最后,您还使用了!values[1].isEmpty() == true,它将boolean值与true进行比较。这通常是一种不好的做法,您可以将其减少为!values[1].isEmpty(),而该功能将具有相同的功能。尽量不要将==boolean一起使用。

关于java - 将制表符分隔的列读入列表-Java,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57616307/

10-10 04:18