[英]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.