【问题标题】:Java How to Read Data From a String (stringstream equivalent) [closed]Java如何从字符串中读取数据(等效的字符串流)[关闭]
【发布时间】:2022-01-23 04:54:36
【问题描述】:

假设我有一个字符串(称为 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]);

但是,我将不得不对许多不同的输入执行此操作,因此我想使用最有效和最快的方式来执行此操作。

问题:

  • 有没有更有效/更快的方法来做到这一点?也许是更清洁的方式?

【问题讨论】:

标签: java string parsing split


【解决方案1】:

像这样试试。 Scanner 的构造函数可以将字符串作为数据源。

Scanner scan = new Scanner("12 34 55 88");
while (scan.hasNext()) {
   System.out.println(scan.nextInt());  
}

打印

12
34
55
88

【讨论】:

    【解决方案2】:

    正如 cmets 中所提到的,如果这是来自键盘(或真正来自输入流),您可以使用 Scanner 类来执行此操作。但是,对于键盘以外​​的输入源,我不会使用Scanner,而是使用其他一些方法来解析字符串。例如,如果从文件中读取行,您可能希望使用 Reader 来代替。对于这个答案,我假设输入源是键盘。

    使用 Scanner 获取输入

    Scanner scanner = new Scanner(System.in);
    System.out.print("Provide your input: ");
    String input = scanner.nextLine();
    input.close();
    

    将字符串分解为标记

    这里有几个选项。一种是通过使用空格作为分隔符将输入拆分为子字符串:

    String[] words = input.split("\\s");
    

    如果这些子字符串的顺序得到保证,您可以将它们直接分配给变量(不是最优雅的解决方案 - 但可读)

    String first = words[0];
    String second = words[1];
    double third = words[2];
    int fourth = words[3];
    

    或者,您可以使用String#substring(int) 和/或String#substring(int, int) 方法直接提取子字符串,并测试获得的子字符串是数字(双精度还是整数),或者只是一个字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-03
      • 1970-01-01
      • 2015-11-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多