读取多行中的多个整数

时间:2016-12-30 10:03:28

标签: java java.util.scanner

我目前正在撰写图论的学士论文,并使用java扫描程序将带有边的txt文件转换为我的Java类图。我的txt文件如下所示:

  

1 2 72 3
  2 3 15 98
  4 7 66 49
  5 6 39 48
  6 9 87 97
  8 13 31 5

整数排序为:源顶点,汇点顶点,成本,容量。

我的代码如下:

Graph graph = new Graph(false);
File f = new File("Filepath");
Scanner in = new Scanner(f);
while (in.hasNextLine())
{
    for (int i =1; i<= numberEdges; i++)
    {
        String s = in.nextLine();
        try (Scanner inscan = new Scanner(s)) {
            while (inscan.hasNext())
            {
                int source = inscan.nextInt();
                int sink = inscan.nextInt();
                double cost =inscan.nextDouble();
                double capacity = inscan.nextDouble();
                Vertex Source = new Vertex(source);
                Vertex Sink = new Vertex(sink);
                Edge edge = new Edge(Source,Sink, cost, capacity);
                graph.addEdge(edge);
            }
        }
    }    
}
in.close();

我尝试扫描String中的每一行,然后将String扫描到我的变量中。 它总是抛出一个NoLineFound&#34;在for循环的第一行中有异常,如果我尝试输出行,我就得不到。但是,当我禁用第二台扫描仪并再次尝试时,我会在输出中获得所有线路,但最后仍然是#34; NoLineFound&#34;异常。

我检查了我的txt文件,最后一行没有UTF8行结尾,但我不知道如何给它一个。

4 个答案:

答案 0 :(得分:6)

我认为你的问题来自于:

while (in.hasNextLine()){
    for (int i =1; i<= numberEdges; i++)
        {

首先,迭代是多余的(whilefor足以读取每一行。你必须在它们之间做出选择。)
此外,如果您的文件的行数少于numberEdges,则会引发java.util.NoSuchElementException

如果文件中的行数是常量,请使用for

for (int i =1; i<= numberEdges; i++)

删除封闭的while (in.hasNextLine())。这不是必需的。迭代控制已由for完成。

如果文件中的行数可能不同,请仅使用while

    while (in.hasNextLine()){

但无论如何,不​​要同时使用它们。

答案 1 :(得分:6)

使用Java 8流:

Files
    .lines(f.toPath())
    .map(l ->Arrays.stream(l.split(" ")).mapToDouble(Double::parseDouble).toArray())
    .map(a->new Edge(new Vertex((int)a[0]), new Vertex((int)a[1]), a[2], a[3]))
    .forEach(graph::addEdge);

答案 2 :(得分:2)

nextLine()进行一次检查后,您正在循环中阅读hasNextLine()。你需要在每次阅读后进行检查,以避免&#34; NoLineFound&#34;异常。

看起来嵌套循环完全没必要。您可以逐行读取文件,忽略空行,并在不事先了解其边缘数的情况下构建图形:

Graph graph = new Graph(false);
File f = new File("Filepath");
Scanner in = new Scanner(f);
while (in.hasNextLine()) {
    String s = in.nextLine();
    try (Scanner inscan = new Scanner(s)) {
        if (!inscan.hasNext()) {
            continue; // Ignore empty lines
        }
        int source = inscan.nextInt();
        int sink = inscan.nextInt();
        double cost =inscan.nextDouble();
        double capacity = inscan.nextDouble();
        Vertex Source = new Vertex(source);
        Vertex Sink = new Vertex(sink);
        Edge edge = new Edge(Source,Sink, cost, capacity);
        graph.addEdge(edge);
    }    
}
in.close();

答案 3 :(得分:1)

请在阅读后进行检查以避免&#34; NoLineFound&#34;异常。

您可以使用以下代码扫描文件:

import java.io.File;
import java.util.Scanner;

public class ReadFile {

    public static void main(String[] args) {

        try {
            System.out.print("Enter the file name with extension : ");
            Scanner input = new Scanner(System.in);
            File file = new File(input.nextLine());
            input = new Scanner(file);

            while (input.hasNextLine()) {
                String line = input.nextLine();
                System.out.println(line);
            }
            input.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

}