我是Java的新手,目前我正忙于学校的一些工作。 我的程序正在读取带有行的输入文件。 如果我的输入文件有一行像
" Orville's Acres,114.8 43801"
我必须将文本,双精度,整数分成单独的部分。 我已将名称部分完成但仍停留在数字部分。
我如何提取114.8然后只提取43801? 我一次需要一个数字。 最后我需要将114.8分成43801.然后到下一行。
Scanner fileInput = new Scanner(inFile);
fileInput.useDelimiter( "\\D+" );
double i=0;
while ( fileInput.hasNextDouble() ){
i=fileInput.nextDouble(); // get int
System.out.println(i);
}
我尝试了这个,但打印出来了 114.0 8 43801.0
如您所见,十进制数字不正确,我一次只需要一个数字。
答案 0 :(得分:2)
考虑输入" 114.8 43801",您可能希望使用空格作为分隔符。使用' \ D +'作为您的分隔符,您可以根据Java文档将字符串拆分为任何非数字: https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html
因此,你正在分裂为“114.8'
”尝试使用默认的空白分隔符(不要设置一个..),它应该可以工作。
答案 1 :(得分:0)
您应该使用正则表达式。 docs for Pattern
String raw="Orville's Acres, 114.8 43801";
Pattern p=Pattern.compile("\\d+.?[\\d]*");
Matcher m=p.matcher(raw);
while(m.find()){
System.out.println(m.group());
}
输出:
114.8
43801
答案 2 :(得分:0)
你将8作为单独的token
的原因是因为你将delimiter
设置为'\ D +',正如Vincent所说。您可以将delimiter
视为规则,将如何将一行字符串分隔为不同的tokens
,其中令牌就像一个字符串。
如果没有指定上面设置的分隔符,即使用默认分隔符,您将使用' ', '\t', '\n'
等空格分隔String。
这意味着您可以通过调用scanner.getNext()
:
{Orville's}, {Acres,}, {114.8}, {43801}
。
如果您了解输入数据的格式,则可以使用Integer.parse(string)
Double.parse(string)
。这些将解释String值中的数字并将其返回给您。但请注意,如果传递给这些方法的字符串参数不是parse()
方法所期望的格式(例如:string = "One"
或string = myId123
,其中包含非数字的内容) ,你会得到格式异常,你的程序会崩溃。
你说你做了名字部分;我认为你能够获得以下line
部分。假设您已了解输入数据的格式,您就知道double有一个“。”在令牌中。因此,您可以尝试以下代码:
String line = "114.8 43801";
while (scanner.hasNext())
{
String token = scanner.next();
if (token.contains(".")) // return true if the string has "." in it
{
doubleToken = Double.parseDouble(token);
System.out.println(doubleToken); // prints "114.8"
}
else
{
intToken = Integer.parseInt(token);
System.out.println(intToken); // prints "43801"
}
}
答案 3 :(得分:0)
假设文件中的行格式保证为:
String Double Integer
或当名称中有两个单词时:
String String Double Integer
你可以将各行分成三部分并从那里解析。您现在似乎一直专注于从扫描仪中取出单个部件,当您可以使用整条生产线时。
Scanner fileInput = new Scanner(inFile);
String name = "";
double d = 0;
int i = 0;
while (fileInput.hasNextLine()) {
String line = fileInput.nextLine(); // get the entire line
String[] parts = line.split(" "); // split into its three parts
if (parts.length == 3) {
name = parts[0]; // the first part is the name
d = Double.valueOf(parts[1]); // the second part is the double
i = Integer.valueOf(parts[2]); // the third part is the integer
} else {
name = parts[0] + " " + parts[1]; // the name is the first two parts
d = Double.valueOf(parts[2]); // the third part is the double
i = Integer.valueOf(parts[3]); // the fourth part is the integer
}
System.out.println("Got name: " + name + ", double: " + d + ", int: " + i);
}
这是一个非常有限的示例,但根据示例输入,它将起作用。它可以扩展为使用名称具有任意数量的单词的行。
答案 4 :(得分:0)
最简单的方法是: 1)使用BufferedReader将整行读取为String 2)使用'空格'分割字符串。作为分隔符,它将返回String []数组 3)for(数组中的每个元素) 3.1)print(Double.parseDouble(element))
答案 5 :(得分:0)
您只需将正则表达式更改为
\\d+.?[\\d]*