b1rc challenge by @jeevjyot (#551)
* b1rc challenge * fixed a rounding error * added the file back * fixed file * removed a file --------- Co-authored-by: Jeevjyot Singh Chhabda <jeevjyotsinghchhabda@Jeevjyots-MBP.hsd1.ca.comcast.net>
This commit is contained in:
parent
2c432abb96
commit
415b3eb5c5
19
calculate_average_jeevjyot.sh
Executable file
19
calculate_average_jeevjyot.sh
Executable file
@ -0,0 +1,19 @@
|
|||||||
|
#!/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=""
|
||||||
|
java $JAVA_OPTS --class-path target/average-1.0.0-SNAPSHOT.jar dev.morling.onebrc.CalculateAverage_jeevjyot
|
107
src/main/java/dev/morling/onebrc/CalculateAverage_jeevjyot.java
Normal file
107
src/main/java/dev/morling/onebrc/CalculateAverage_jeevjyot.java
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
/*
|
||||||
|
* 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 static java.lang.Math.round;
|
||||||
|
import static java.util.stream.Collectors.*;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.TreeMap;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
import java.util.stream.Collector;
|
||||||
|
|
||||||
|
public class CalculateAverage_jeevjyot {
|
||||||
|
|
||||||
|
public static final String MEAUREMENT_FILE = "./measurements.txt";
|
||||||
|
|
||||||
|
public static void main(String[] args) throws IOException {
|
||||||
|
Map<String, tempMeasurement> result = new ConcurrentHashMap<>();
|
||||||
|
Files.lines(Path.of(MEAUREMENT_FILE))
|
||||||
|
.parallel()
|
||||||
|
.forEach(s -> {
|
||||||
|
var separatorIndex = s.indexOf(";");
|
||||||
|
var stationName = s.substring(0, separatorIndex);
|
||||||
|
var temp = s.substring(separatorIndex + 1);
|
||||||
|
result.computeIfAbsent(stationName, d -> new tempMeasurement(parseDoubleFast(temp)))
|
||||||
|
.recordTemp(parseDoubleFast(temp));
|
||||||
|
});
|
||||||
|
|
||||||
|
TreeMap<String, tempMeasurement> sortedStats = new TreeMap<>(result);
|
||||||
|
System.out.println(sortedStats);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static double parseDoubleFast(String str) {
|
||||||
|
// Simple implementation - can be improved with more error checking and support for different formats
|
||||||
|
boolean negative = false;
|
||||||
|
double result = 0;
|
||||||
|
int length = str.length();
|
||||||
|
int i = 0;
|
||||||
|
if (str.charAt(0) == '-') {
|
||||||
|
negative = true;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
for (; i < length; i++) {
|
||||||
|
char c = str.charAt(i);
|
||||||
|
if (c == '.') {
|
||||||
|
int divisor = 1;
|
||||||
|
for (i++; i < length; i++) {
|
||||||
|
result += (double) (str.charAt(i) - '0') / (divisor *= 10);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
result = result * 10 + (c - '0');
|
||||||
|
}
|
||||||
|
return negative ? -result : result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static double round(double value) {
|
||||||
|
return Math.round(value * 10.0) / 10.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class tempMeasurement {
|
||||||
|
double minTemp;
|
||||||
|
double maxTemp;
|
||||||
|
double sum;
|
||||||
|
int count;
|
||||||
|
|
||||||
|
public tempMeasurement(double temString) {
|
||||||
|
this.minTemp = temString;
|
||||||
|
this.maxTemp = temString;
|
||||||
|
this.sum = 0.0;
|
||||||
|
this.count = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public synchronized void recordTemp(Double temp) {
|
||||||
|
this.minTemp = Math.min(minTemp, temp);
|
||||||
|
this.maxTemp = Math.max(maxTemp, temp);
|
||||||
|
sum += temp;
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
double getAverage() {
|
||||||
|
return round(sum) / count;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return String.format("%.1f/%.1f/%.1f", round(minTemp), round(getAverage()), round(maxTemp));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user