实施例#1中。 1 AM Roset Malin 18 19
实施例#2。下午2点Margie 20 21
如果你做了类似于Ex#1的事情......
int a = scanner.nextInt() << 1
String b = scanner.next() << AM
String name = scanner.next() << Roset //Malin will not be shown here
String c = scanner.nextInt() << 18
如果你想拥有&#34; Roset Malin&#34;在单个变量AND中,对于Ex#2仍然可以正常工作,其中没有两个部分名称?
我似乎找不到办法来做到这一点。在人们问起之前,我不熟悉tokenizer,buffreaders(??)等等。只使用过扫描仪。
答案 0 :(得分:0)
正如您已经注意到的,在检索空格分隔数据时,名称可能是一个真正的问题,因为名称可以包含一个或多个单词,例如:
Dr. Steven Jon Parker III
甚至可能根本不需要考虑任何可能需要考虑的名称。
我认为一个简单的解决方案是使用Scanner.nextLine()方法而不是Scanner.next()方法,然后 拆分 传入的文件行String.split()方法。在我看来,这样可以让您在这种情况下更容易控制读取数据。
下面的代码示例使用上述 Scanner.nextLine()和 String.split()方法。当然,所有内容都包含在 while 循环代码块中,以便遍历整个文件。 while 循环的条件使用Scanner.hasNextLine()方法,如果扫描仪的输入中有另一行,则返回布尔 true 对象
您还会注意到代码中使用了Regular Expressions(RegEx)。这些是简单的表达,我将解释他们现在所做的事情:
String.split()方法中使用的表达式 - “\\ s +”:
String.split()方法根据提供的方法分隔符将它的相应字符串拆分为One Dimensional (1D) String Array,在这种情况下,该方法是一个空格分隔符。 “\\ s”表达式表示单个空格,而实际使用的“\\ s +”表达式表示一个或更多白色空格。为什么一个或多个?好吧,基本上处理在数据输入期间提供了无意的空白可能的错字,并且在数据字符串保存到文件之前没有删除。
String.matches()中使用的表达式 方法 - “\\ d +”:
在下面的代码中,我们还使用String.matches()方法来验证我们即将使用Integer.parseInt()方法转换为整数的字符串确实是的字符串表示形式数字 值。如果我们尝试将值传递给包含空格或alpha(非数字)字符的此方法,那么 Integer.parseInt()方法将抛出NumberFormatException并可能暂停代码执行。
String.matches() 方法中使用的“\\ d”表达式表示相应的字符串是否与字符串表示匹配一个数字的数字。实际使用的“\\ d +”表达式表示相应的字符串是否匹配 一个或多个 数字的字符串表示,我们已经知道了为什么我们想要一个或多个数字。
如上所述, String.matches() 方法仅用于验证我们将要传递给 整数的事实。 parseInt() 方法确实是一个字符串数值,但是如果它验证失败,则将0放入其各自的int变量中。我们使用Ternary Operator来执行此操作。三元运算符(有时也称为条件运算符)基本上是 if / else 情况的缩短版本。
这是代码。是的......它看起来很多,但如果你愿意的话,你可以安全地删除这些评论:
// A try/catch is required in case the supplied
// file could not be found.
try {
// Try With Resources to auto close the Scanner object
try (Scanner scanner = new Scanner(new File("Data.txt"))) {
// Iterate through the file line by line
while (scanner.hasNextLine()) {
String strg = scanner.nextLine();
// Skip past blank lines (if any) and Comment Lines
// that start with a semicolon (;) (if any). We don't
// want to process these.
if (strg.trim().equals("") || strg.trim().startsWith(";")) {
continue;
}
// Split the read in line into a String Array
String[] parts = strg.split("\\s+");
// Get the number from the current file data line. Ternary
// is used here. If the data is found not to be numerical
// then 0 is used.
int number = parts[0].matches("\\d+") ? Integer.parseInt(parts[0]) : 0;
// Get the AM or PM from the current file data line
String amPM = parts[1];
// Get the name from the current file data line
String name = ""; // Declare & initialize the name variable
// Start from parts Array index 2 because we already used 0 & 1
int i = 2;
// Get the Name regardless of its length...
for (; i < parts.length; i++) {
// If we hit an element that is a numerical value
// then we know we hit the end of our name, so we get
// out of this loop with the break statement.
if (parts[i].matches("\\d+")) { break; }
// Ternary used here to see if the name variable contains
// anything. If it doesn't then just a word is appended to
// the string held by the variable otherwise a whitespace
// and the word is appended.
name+= name.equals("") ? parts[i] : " " + parts[i];
}
// If it was found that there is no name supplied
// in the current file data line then we will make
// the name hold the string of: "Unknown".
if (name.trim().equals("")) {
name = "Unknown";
}
// Get first value after the name. Ternary is used here.
// If the data is found not to be numerical then 0 is used.
int valOne = parts[i].matches("\\d+") ? Integer.parseInt(parts[i]) : 0;
// Get second value after the name. Ternary is used here.
// If the data is found not to be numerical then 0 is used.
int valTwo = parts[i + 1].matches("\\d+") ? Integer.parseInt(parts[i + 1]) : 0;
// Display variable contents to the Console Window.
System.out.println("Number:\t" + number);
System.out.println("AMPM:\t" + amPM);
System.out.println("Name:\t" + name);
System.out.println("Value1:\t" + valOne);
System.out.println("Value2:\t" + valTwo);
System.out.println("=====================");
}
}
}
catch (FileNotFoundException ex) {
Logger.getLogger("Get Data Test").log(Level.SEVERE, null, ex);
}
此代码已针对名为Data.txt的数据文本文件进行了测试。这是它包含的内容:
1 AM Roset Malin 18 19
2 PM Margie 20 21
3 PM Dr. Steven Jon Parker III 18 19
4 AM 20 21
5 AM Jack B Black 20 21
控制台窗口显示:
Number: 1
AMPM: AM
Name: Roset Malin
Value1: 18
Value2: 19
=====================
Number: 2
AMPM: PM
Name: Margie
Value1: 20
Value2: 21
=====================
Number: 3
AMPM: PM
Name: Dr. Steven Jon Parker III
Value1: 18
Value2: 19
=====================
Number: 4
AMPM: AM
Name: Unknown
Value1: 20
Value2: 21
=====================
Number: 5
AMPM: AM
Name: Jack B Black
Value1: 20
Value2: 21
=====================