簡體   English   中英

如何獲取字符串中的數字,然后計算它們的平均值?

[英]How do I get the numbers in a String and then calculate the average of them?

因此,我目前正在試驗 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”的Stringarray,因為我拆分了String。 但在那之后,我嘗試將所有內容轉換為 Integerarray 以更輕松地獲得平均值,但它不起作用,因為“589 56”轉換為“58956”。 有沒有人有更好的方法? 提前致謝。

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

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 和 Matcher這個正則表達式\\b\\d+\\b ,它使用工作邊界,像這樣:

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

最后一個解決方案只能在 Java9+ 上工作。

試試這個

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

對 replaceAll 的調用從字符串中去除所有非數字字符,包括空格。 這會將“589 Hello 56”轉換為“58956”。 嘗試使用replaceAll("[^0-9\\\\s]", "")

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM