Plan/Plan/src/main/java/com/djrapitops/plan/ui/graphs/SessionLengthDistributionGr...

99 lines
3.5 KiB
Java

/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package main.java.com.djrapitops.plan.ui.graphs;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import main.java.com.djrapitops.plan.data.SessionData;
import main.java.com.djrapitops.plan.utilities.AnalysisUtils;
import main.java.com.djrapitops.plan.utilities.MathUtils;
/**
*
* @author Risto
*/
public class SessionLengthDistributionGraphCreator {
public static String[] generateDataArraySessions(Collection<SessionData> data) {
List<Long> lengths = AnalysisUtils.transformSessionDataToLengths(data);
return generateDataArray(lengths);
}
public static String[] generateDataArray(Collection<Long> lengths) {
Map<Long, Integer> values = getValues(lengths);
Map<Long, Integer> scaled = scale(values);
StringBuilder arrayBuilder = buildString(scaled);
StringBuilder labelBuilder = buildLabels(scaled);
return new String[]{arrayBuilder.toString(), labelBuilder.toString()};
}
private static StringBuilder buildString(Map<Long, Integer> scaled) {
StringBuilder arrayBuilder = new StringBuilder();
arrayBuilder.append("[");
long big = MathUtils.getBiggestLong(scaled.keySet());
for (long key = 0; key <= big; key++) {
Integer value = scaled.get(key);
if (value == null) {
continue;
}
arrayBuilder.append(value);
if (key != big) {
arrayBuilder.append(", ");
}
}
arrayBuilder.append("]");
return arrayBuilder;
}
private static StringBuilder buildLabels(Map<Long, Integer> scaled) {
StringBuilder arrayBuilder = new StringBuilder();
arrayBuilder.append("[");
long big = MathUtils.getBiggestLong(scaled.keySet());
for (long key = 0; key <= big; key++) {
Integer value = scaled.get(key);
if (value == null) {
continue;
}
arrayBuilder.append("\'").append(key - 5).append(" - ").append(key).append(" min").append("\'");
if (key != big) {
arrayBuilder.append(", ");
}
}
arrayBuilder.append("]");
return arrayBuilder;
}
private static Map<Long, Integer> getValues(Collection<Long> lengths) {
List<Long> unused = new ArrayList<>(lengths);
Map<Long, Integer> values = new HashMap<>();
long lengthInMinutes = 5;
while (!unused.isEmpty() && lengthInMinutes < 120) {
long length = lengthInMinutes * 60 * 1000;
List<Long> lessThan = unused.stream().filter(l -> l < length).collect(Collectors.toList());
values.put(lengthInMinutes, lessThan.size());
unused.removeAll(lessThan);
lengthInMinutes += 5;
}
return values;
}
private static Map<Long, Integer> scale(Map<Long, Integer> values) {
Map<Long, Integer> scaled = new HashMap<>();
int total = MathUtils.sumInt(values.values().stream().map(i -> (Serializable) i));
for (long key : values.keySet()) {
scaled.put(key, (int) ((1.0 * values.get(key) / total) * 100));
}
return scaled;
}
}