2015-11-06 57 views
0

我试图做一个无向图与一些节点(不是所有的,不像我的例子)被连接到另一个。所以我的输入格式看起来像如果我使用分隔符,如何检查使用扫描仪查看换行符?

3 
1:2,3 
2:1,3 
3:1,2 

含义有三个节点的一切,和1连接到2和3,2连接到1和3等。

但是,我不明白如何以有意义的方式接受输入。这是迄今为止我所拥有的。

public Graph createGraph() { 
    Scanner scan = new Scanner(System.in).useDelimiter("[:|,|\\n]"); 
    int graphSize = scan.nextInt(); 
    System.out.println(graphSize); 
    for (int i = 0; i < graphSize; i++) { 
     while (!scan.hasNext("\\n")) { 
      System.out.println("Scanned: " + scan.nextInt()); 
     } 
    } 
    return new Graph(graphSize); 

} 

可我

while (!scan.hasNext("\\n")) 

看到,当我使用它分隔符的换行符?

+2

分隔符用于将字符串拆分为令牌并在进程中丢失。如果令牌对您有意义,则不应将其用作分隔符 – Aaron

+0

我已经尝试过,但如果我将新行隔离在分隔符外,则第一个数字不会被输入 –

+0

您是否期待换行符为你的输入本身的一部分? – AbtPst

回答

0

是的,扫描仪绝对可以检测到新行。事实上,你甚至不必明确地指定它。只需使用

scan.hasNextLine() 

基本上保持持续,只要有您的输入

编辑线

你为什么不先阅读一切,然后用你的for循环?

+0

是的,我知道,但我希望while循环结束后,每一个新行,不要继续下去,直到我结束输入。 –

+0

umm,所以你希望while循环在每行之后结束?那么如果循环在第一行之后结束,那么如何解析剩余的行? – AbtPst

+0

我的while循环位于for循环的内部,该循环针对多个节点进行迭代,所以while循环结束时,for循环将再次循环,直到所有节点都被占用。 –

0

在我看来,如果它们是有意义的记号,你就不应该使用这些分隔符。例如,在第二行中,第一个整数的意思与其他的意思不同,所以:是有意义的,应该被扫描,即使稍后才会被丢弃。然而,这并不会改变由它分隔的令牌的含义,因此使用它作为分隔符是安全的:只要它们由,分隔,它们仍具有相同的含义,就可以抓取整数。

因此,最后,我会使用,作为分隔符,并手动检查\n:,以便在遇到它们时调整我的代码行为。

+0

我会试试这个,谢谢。 –

+0

@JoshNewlin不客气,祝你好运 – Aaron

0

好吧我想通了。这不是我写过的最漂亮的代码,但它完成了工作。

public Graph createGraph() { 
    Scanner scan = new Scanner(System.in); 
    number = scan.nextLine(); 
    graphSize = Integer.valueOf(number); 
    System.out.println(graphSize); 
    for (int i = 0; i < graphSize; i++) { 
     number = scan.nextLine(); 
     Scanner reader = new Scanner(number).useDelimiter(",|:"); 
     while (reader.hasNextByte()) { 
      System.out.println("Scanned: " + reader.nextInt()); 
     } 
    } 
    return new Graph(graphSize); 

}