Hallo ,
lässt sich hier etwas vereinfachen was ich aber bislang nicht sehe?:
/* .... */
f.addLine("Parse Systems");
long counter1 = 0;
long counter2 = 0;
long counter3 = 0;
long counter4 = 0;
try (BufferedReader r = new BufferedReader(new FileReader("a.csv"))) {
String[] h = r.readLine().split(",");
String l;
a : while ((l = r.readLine()) != null) {
counter4++;
String[] ar = l.split(",", h.length);
if (ar.length != h.length) {
throw new IllegalArgumentException(l);
}
HashMap<String, Object> m = new HashMap<>();
for (int i = 0; i < h.length; i++) {
if (ar[i].isEmpty()) {
counter1++;
ar[i] = "-1";
}
if (i >= 3 && i <= 5) {
Object o = parseN(ar[i], 1, true);
if (o == null) {
counter2++;
f.addLine(l);
continue a;
}
m.put(h[i], o);
} else {
m.put(h[i], parseN(ar[i], 2, false));
}
}
if (distToSol(m) > 150) {
counter3++;
continue;
}
systems.put((Long) m.get("id"), m);
}
} catch (IOException ex) {
f.addLine(ex.getMessage());
}
f.addLine("Counter: " + counter1 + ", " + counter2 + ", " + counter3 + "= " + counter4);
f.addLine("Systems: " + systems.size());
/* .... */
Object parseN(String s, int min, boolean failFast) {
switch (min) {
case 3:
try {
return Integer.parseInt(s);
} catch (NumberFormatException e1) {
try {
return Long.parseLong(s);
} catch (NumberFormatException e2) {
try {
return Float.parseFloat(s);
} catch (NumberFormatException e3) {
if (failFast) {
return null;
}
return s;
}
}
}
case 2:
try {
return Long.parseLong(s);
} catch (NumberFormatException e2) {
try {
return Float.parseFloat(s);
} catch (NumberFormatException e3) {
if (failFast) {
return null;
}
return s;
}
}
default:
try {
return Float.parseFloat(s);
} catch (NumberFormatException e3) {
if (failFast) {
return null;
}
return s;
}
}
}
float distToSol(HashMap<String, Object> m) {
return (float) Math.sqrt((Float) m.get("x") * (Float) m.get("x") + (Float) m.get("y") * (Float) m.get("y") + (Float) m.get("z") * (Float) m.get("z"));
}
LinkedHashMap<Long, HashMap<String, Object>> systems = new LinkedHashMap<>();
Ein paar Werte:
Es gibt 22967572 Systeme, davon sind 25641 gesucht, 22941930 nicht gesucht und 1 ungültig.
Ich brauche also 0,11 % der Systeme.
Das Problem ist, dass das parsen 7,5 Minuten dauert!!!