这是一个简单的例子,解释了我遇到的问题:
public static String nextTwoTokens(Scanner scan) {
String partOne = scan.next();
String partTwo = scan.next();
return partOne+partTwo;
}
这应该可以正常工作,除非我不想修改"光标"的位置。在我的两个.next()
的扫描仪中。
根据我的阅读,您无法复制扫描仪对象。在那种情况下,我将如何记住"光标在扫描仪中的位置,然后在我返回此方法之前返回到该位置?
如果我不能这样做,有没有办法让扫描仪正在读取来源以构建另一台扫描仪?在这种情况下,如果我需要创建另一个扫描仪,那么新的扫描仪可以在文件/输入流/开头的任何地方开始,而不是旧扫描仪光标的位置。
答案 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的问题,但它是问题标题的有效答案,它解决了我的问题。)