字符串是,例如"r1"
,我需要1
形式的int
Scanner sc = new Scanner("r1");
int result = sc.nextInt(); // should be 1
正确编译但有运行时错误,我应该使用分隔符吗?我不确定分隔符的作用。
答案 0 :(得分:4)
嗯,有几个选择。由于您确实希望跳过“r”然后读取数字,您可以使用Scanner#skip
。例如,要跳过所有非数字,请阅读数字:
Scanner sc = new Scanner("r1");
sc.skip("[^0-9]*");
int n = sc.nextInt();
如果没有前导非数字,那也可以。
另一种选择是使用非数字作为分隔符,如您所述。例如:
Scanner sc = new Scanner("x1 r2kk3 4 x56y 7g");
sc.useDelimiter("[^0-9]+"); // note we use + not *
while (sc.hasNextInt())
System.out.println(sc.nextInt());
输出六个数字:1,2,3,4,56,7。
另一种选择,取决于输入的性质,是通过提前用空格替换所有非数字来预处理字符串,然后使用默认配置的扫描程序,例如:
String input = "r1";
input = input.replaceAll("[^0-9]+", " ");
当然,你总是可以预先处理字符串以删除第一个字符,如果你知道它是那个形式,然后使用扫描仪(或只是Integer#parseInt
):
String input = "r1";
input = input.substring(1);
您的工作取决于您最适合的输入。将“非数字”替换为您想要跳过的任何内容。
顺便说一句,我相信一盏灯scolding is in order for this:
我不确定分隔符的作用。
介绍文字中Scanner
explains this quite clearly的文档,甚至展示了一个示例。
此外,“分隔符”一词的定义本身是readily available。
答案 1 :(得分:0)
如果所有输入的格式都相同,那么最后一个字符是您可以使用的值:
String s = sc.nextLine()
Int i = Integer.parseInt(s.charAt(s.length() -1));
否则,您可以将字符串作为char数组,通过它迭代并检查每个字符是否为数字。
答案 2 :(得分:0)
这里有一些根本性的错误。
首先,你说:
One = sc.nextInt("r1");
正确编译......
不,不。如果sc
确实是java.util.Scanner
,那么就没有Scanner.nextInt(String)
方法,因此无法编译。
第二个问题是hasNextXXX
和nextXXX
方法不解析它们的参数。它们解析扫描仪输入源中的字符。
第三个问题是Scanner
没有提供一种方法来完成你(显然)试图做的事情。
如果您的String
s
包含值"r1"
,那么您根本不需要Scanner
。你需要做什么这样的事情:
String s = ...
int i = Integer.parseInt(s.substring(1));
或者可能是这样的:
Matcher m = Pattern.compile("r(\\d+)").matcher(s);
if (m.matches()) {
int i = Integer.parseInt(m.group(1));
}
...在提取数字之前检查字段是否为预期格式。
另一方面,如果你真的想从扫描仪中读取字符串,你可以这样做:
String s = sc.next();
然后按上述方式提取数字。