From 48a6e49e471f67b64abd673951c69a610ce8864a Mon Sep 17 00:00:00 2001 From: itaske <39966884+itaske@users.noreply.github.com> Date: Tue, 2 Jan 2024 20:01:33 +0100 Subject: [PATCH] Adding itaske's implementation --- calculate_average_patrick.sh | 20 +++++ .../onebrc/CalculateAverage_patrick.java | 76 +++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 calculate_average_patrick.sh create mode 100644 src/main/java/dev/morling/onebrc/CalculateAverage_patrick.java diff --git a/calculate_average_patrick.sh b/calculate_average_patrick.sh new file mode 100644 index 000000000..25f725f4e --- /dev/null +++ b/calculate_average_patrick.sh @@ -0,0 +1,20 @@ +#!/bin/sh +# +# Copyright 2023 The original authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + + +JAVA_OPTS="" +time java $JAVA_OPTS --class-path target/average-1.0.0-SNAPSHOT.jar dev.morling.onebrc.CalculateAverage_patrick diff --git a/src/main/java/dev/morling/onebrc/CalculateAverage_patrick.java b/src/main/java/dev/morling/onebrc/CalculateAverage_patrick.java new file mode 100644 index 000000000..298a43745 --- /dev/null +++ b/src/main/java/dev/morling/onebrc/CalculateAverage_patrick.java @@ -0,0 +1,76 @@ +/* + * Copyright 2023 The original authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package dev.morling.onebrc; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.AbstractMap; +import java.util.Comparator; +import java.util.Map; +import java.util.concurrent.ConcurrentSkipListMap; +import java.util.stream.Collectors; + +public class CalculateAverage_patrick { + + private static final String FILE = "./measurements.txt"; + + private record Measurement(long count, double sum, double min, double max) { + + Measurement(double value) { + this(1, value, value, value); + } + + + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append(round(min)); + builder.append("/"); + builder.append(round(sum/count)); + builder.append("/"); + builder.append(round(max)); + + return builder.toString(); + } + + private double round(double value) { + return Math.round(value * 10.0) / 10.0; + } + } + + public static void main(String[] args) throws IOException { + + Map resultMap = Files.lines(Path.of(FILE)).parallel() + .map(line -> { + int separatorIndex = line.indexOf(";"); + String key = line.substring(0, separatorIndex); + double value = Double.parseDouble(line.substring(separatorIndex + 1)); + return new AbstractMap.SimpleEntry<>(key, value); + }) + .collect(Collectors.toConcurrentMap( + entry -> entry.getKey(), + entry -> new Measurement(entry.getValue()), + ((measurement1, measurement2) -> new Measurement( + measurement1.count + measurement2.count, + measurement1.sum + measurement2.sum, + Math.min(measurement1.min, measurement2.min), + Math.max(measurement1.max, measurement2.max))))); + + System.out.print( + resultMap.entrySet().stream().sorted(Map.Entry.comparingByKey()).map(Object::toString).collect(Collectors.joining(", ", "{", "}"))); + + } +}