【问题标题】:How do I get the numbers in a String and then calculate the average of them?如何获取字符串中的数字,然后计算它们的平均值?
【发布时间】:2020-04-21 10:14:19
【问题描述】:

所以我目前正在尝试使用 Streams,并尝试计算流中字符串“589 Hello 56”中数字的平均值。 我的做法是这样的:

List <int[]> experiment = a.stream()
    .map(x -> x.replaceAll("[^0-9]", "").split("\\D+"))
    .map(x-> Arrays.asList(x).stream().mapToInt(Integer::parseInt).toArray())
    .collect(Collectors.toList());

所以我首先得到一个带有“589 56”的字符串数组,因为我拆分了字符串。 但在那之后,我尝试将所有内容转换为 Integerarray 以更轻松地获得平均值,但它不起作用,因为“589 56”转换为“58956”。 有没有人有更好的方法?提前致谢。

【问题讨论】:

  • 所以你想从字符串中取出所有数字,然后计算它们的平均值?
  • 数字收集是一种不同的操作...不知道为什么要将它包含在任何流处理中。一旦你有了这些,你就可以流式传输列表并用它们做任何你想做的事情。
  • @marstran 是的,我想获取所有的数字。所以在这种情况下,它将是“589”和“56”。而且我想计算这两者的平均值,即 (589+56)/2 = 322.5
  • 试试这个Arrays.stream(s.split("\\D+")) .mapToInt(Integer::parseInt) .average();
  • FYI: [^0-9]\D 是一回事,所以你首先删除所有非数字字符,然后尝试拆分现在不存在的非数字字符-digits,这意味着拆分会做事。

标签: java arrays string java-stream


【解决方案1】:

要使用流计算平均值,您需要:

double average = Arrays.stream(a.split("\\D+")) // split with non degits ["589", "56"]
        .mapToInt(Integer::valueOf) // convert each string to integer [589, 56]
        .average()  // OptionalDouble
        .getAsDouble(); // double 322.5

或者如果你不确定你的字符串可以包含任何数字,那么你需要避免这种情况:

.orElse(0);

.orElseThrow(() -> new IllegalArgumentException("no number in the string"));

而不是.getAsDouble();


或者,如果您想更深入,例如避免数字可以在任何非数字前面的情况,例如 a45 Hello 9a7,其中数字可以是单词的一部分,在这种情况下,您可以使用 Pattern和带有这个正则表达式 \b\d+\b 的匹配器,它使用工作边界,如下所示:

double average = Pattern.compile("\\b\\d+\\b")
        .matcher(a)
        .results()
        .map(MatchResult::group)
        .mapToInt(Integer::valueOf)
        .average()
        .orElse(0);

最后一个解决方案只能在 Java9+ 上运行。

【讨论】:

    【解决方案2】:

    试试这个

    String s = "589 Hello 56";
    OptionalDouble average = Arrays.stream(s.split("\\D+"))
                .mapToInt(Integer::parseInt)// or maybe  .mapToDouble(Double::parseDouble)
                .average();
    

    【讨论】:

      【解决方案3】:

      对 replaceAll 的调用会从字符串中删除所有非数字字符,包括空格。这会将“589 Hello 56”转换为“58956”。尝试使用replaceAll("[^0-9\\s]", "")

      您还需要拆分分隔符(即空格)而不是数字。

      【讨论】:

      • 我的想法很遗憾地说:“字符串文字中的非法转义字符”
      • 感谢您的更新,但遗憾的是我的编译器说:线程“main”java.lang.NumberFormatException:当我尝试将其转换为整数数组时输入字符串出现异常:“123456 789”
      猜你喜欢
      • 1970-01-01
      • 2020-06-15
      • 2022-01-15
      • 2021-01-31
      • 2015-10-15
      • 2015-12-26
      • 1970-01-01
      • 1970-01-01
      • 2020-07-05
      相关资源
      最近更新 更多