记住扫描仪中的位置

时间:2014-11-23 02:43:03

标签: java java.util.scanner

这是一个简单的例子,解释了我遇到的问题:

public static String nextTwoTokens(Scanner scan) {
    String partOne = scan.next();
    String partTwo = scan.next();
    return partOne+partTwo;
}

这应该可以正常工作,除非我不想修改"光标"的位置。在我的两个.next()的扫描仪中。

根据我的阅读,您无法复制扫描仪对象。在那种情况下,我将如何记住"光标在扫描仪中的位置,然后在我返回此方法之前返回到该位置?

如果我不能这样做,有没有办法让扫描仪正在读取来源以构建另一台扫描仪?在这种情况下,如果我需要创建另一个扫描仪,那么新的扫描仪可以在文件/输入流/开头的任何地方开始,而不是旧扫描仪光标的位置。

2 个答案:

答案 0 :(得分:2)

Scanner类实际上并没有实现Cloneable接口。您可以通过实现Cloneable接口来创建自定义.clone()方法,但在这种情况下,克隆不是一个好主意。

要回答你的问题,不,你不能这样做。你需要找到一个更好的方法。

另一种方法是使用方便的String[]方法创建.split(delimiter)!所以,你可以这样做:

String s = "This is a test.";
String[] tokens = s.split(" "); //split the string into tokens, cutting at the spaces
for(String token : tokens) {
    System.out.println(token);
}

这应该打印出来

  

这个   是   a   测试

通过这种方式,您可以循环浏览String[]以获取下一个令牌,然后返回到之前的位置。

要回答你在评论中提出的问题,如果你想做的事情不是一个没有真正有分割方法的字符串,我建议你这样做:

Scanner scan = new Scanner(INITIALIZE ME HOWEVER YOU WANT);
ArrayList<String> tokens = new ArrayList<String>();
while(scan.hasNext()) {
    tokens.add(scan.next());
}

基本上,只需阅读所有内容并从中创建一组永久的,可导航的令牌。

这是我能给出的最佳建议。它可能不是最有效的方式,但它肯定是一种万无一失的方法。

答案 1 :(得分:0)

您可以使用scan.match().end()获取流中最后返回的令牌的位置。

(这并不能解决OP的问题,但它是问题标题的有效答案,它解决了我的问题。)