Java 如何从字符串中读取数据(相当于字符串流)
Java How to Read Data From a String (stringstream equivalent)
假设我有一个具有以下格式的字符串(称之为 s):
[String] [String] [double] [int]
例如,
“是詹姆斯 3.5 2”
我想将这些数据读入单独的变量(字符串、字符串、双精度和整数)
请注意,我来自 C++ 背景。在 C++ 中,我会做类似下面的事情:
std::istringstream iss{s}; // create a stream to the string
std::string first, second;
double third = 0.0;
int fourth = 0;
iss >> first >> second >> third >> fourth; // read data
在Java中,我想出了下面的代码:
String[] sa = s.split(" ");
String first = sa[0], second = sa[1];
double third = Double.parseDouble(sa[2]);
int fourth = Integer.parseInt(sa[3]);
但是,我将不得不对许多不同的输入执行此操作,因此我想使用最有效和最快的方法来执行此操作。
问题:
- 还有其他efficient/faster方法吗?也许是更清洁的方式?
正如评论中提到的那样,如果这是来自键盘(或实际上来自输入流),您可以使用 Scanner
class 来实现。但是,对于键盘以外的输入源,我不会使用 Scanner
而是使用其他一些方法来解析字符串。例如,如果从文件中读取行,您可能希望改用 Reader
。对于这个答案,我假设输入源是键盘。
使用扫描仪获取输入
Scanner scanner = new Scanner(System.in);
System.out.print("Provide your input: ");
String input = scanner.nextLine();
input.close();
将字符串分解为标记
这里有几个选项。一种是通过使用白色 space 作为分隔符将输入拆分为子字符串:
String[] words = input.split("\s");
如果保证这些子串的顺序,可以直接赋值给变量(不是最优雅的方案——但可读)
String first = words[0];
String second = words[1];
double third = words[2];
int fourth = words[3];
或者,你可以直接使用String#substring(int)
and/or String#substring(int, int)
方法提取子串,并测试获取的子串是否为数字(double 或 int),或者只是只是一个字符串。
像这样尝试。 Scanner的构造函数可以将字符串作为数据源。
Scanner scan = new Scanner("12 34 55 88");
while (scan.hasNext()) {
System.out.println(scan.nextInt());
}
打印
12
34
55
88
假设我有一个具有以下格式的字符串(称之为 s):
[String] [String] [double] [int]
例如, “是詹姆斯 3.5 2” 我想将这些数据读入单独的变量(字符串、字符串、双精度和整数)
请注意,我来自 C++ 背景。在 C++ 中,我会做类似下面的事情:
std::istringstream iss{s}; // create a stream to the string
std::string first, second;
double third = 0.0;
int fourth = 0;
iss >> first >> second >> third >> fourth; // read data
在Java中,我想出了下面的代码:
String[] sa = s.split(" ");
String first = sa[0], second = sa[1];
double third = Double.parseDouble(sa[2]);
int fourth = Integer.parseInt(sa[3]);
但是,我将不得不对许多不同的输入执行此操作,因此我想使用最有效和最快的方法来执行此操作。
问题:
- 还有其他efficient/faster方法吗?也许是更清洁的方式?
正如评论中提到的那样,如果这是来自键盘(或实际上来自输入流),您可以使用 Scanner
class 来实现。但是,对于键盘以外的输入源,我不会使用 Scanner
而是使用其他一些方法来解析字符串。例如,如果从文件中读取行,您可能希望改用 Reader
。对于这个答案,我假设输入源是键盘。
使用扫描仪获取输入
Scanner scanner = new Scanner(System.in);
System.out.print("Provide your input: ");
String input = scanner.nextLine();
input.close();
将字符串分解为标记
这里有几个选项。一种是通过使用白色 space 作为分隔符将输入拆分为子字符串:
String[] words = input.split("\s");
如果保证这些子串的顺序,可以直接赋值给变量(不是最优雅的方案——但可读)
String first = words[0];
String second = words[1];
double third = words[2];
int fourth = words[3];
或者,你可以直接使用String#substring(int)
and/or String#substring(int, int)
方法提取子串,并测试获取的子串是否为数字(double 或 int),或者只是只是一个字符串。
像这样尝试。 Scanner的构造函数可以将字符串作为数据源。
Scanner scan = new Scanner("12 34 55 88");
while (scan.hasNext()) {
System.out.println(scan.nextInt());
}
打印
12
34
55
88