X
Xyz1
Gast
Hallo, also mal vorweg, es ist eine längere Methode geworden, welche mir jetzt Kopfweh bereitet. Code:
Ich rufe getAlgo2 auf... und die NPE tritt hier in Zeile 111 auf (
Habt ihr eine Idee wieso? Wenn (index == n) dann sollte res eigentlich nicht leer sein.
Java:
LinkedHashMap<Long, Sys> systems = new LinkedHashMap<>();
LinkedHashMap<Long, Sta> stations = new LinkedHashMap<>();
LinkedHashMap<Long, Lis> listings = new LinkedHashMap<>();
float ...;
float ...;
float ...;
int ...;
int ...;
// ...
ArrayList<Lis[]> getAlgo2(App app) {
ArrayList<Sys> sl = new ArrayList<>();
for (Sys s : systems.values()) {
if (getDisToSol(s) < maxDisToSol) {
sl.add(s);
}
}
ArrayList<Lis[]> results1 = new ArrayList<Lis[]>();
ArrayList<Lis[]> results2 = new ArrayList<Lis[]>();
getAlgo2(sl, results1, results2, new Lis[4], false, 0, 3, new HashSet<Long>());
ArrayList<Lis[]> results = new ArrayList<>();
results.addAll(results1);
results.addAll(results2);
return results;
}
//////////
void getAlgo2(ArrayList<Sys> sl, ArrayList<Lis[]> results1, ArrayList<Lis[]> results2, Lis[] res, boolean planets,
int index, int n, HashSet<Long> used) {
if (index == n) {
if (planets) {
if (results1.isEmpty() || compareListings2(res, results1.get(results1.size() - 1)) < 0) {
if (results1.size() == 100) {
results1.remove(results1.size() - 1);
}
Lis[] l = new Lis[n + 1];
System.arraycopy(res, 0, l, 0, n + 1);
results1.add(l);
Collections.sort(results1, (Lis[] l1, Lis[] l2) -> compareListings(l1, l2));
}
} else {
if (results2.isEmpty() || compareListings2(res, results2.get(results2.size() - 1)) < 0) {
if (results2.size() == 100) {
results2.remove(results2.size() - 1);
}
Lis[] l = new Lis[n + 1];
System.arraycopy(res, 0, l, 0, n + 1);
results2.add(l);
Collections.sort(results2, (Lis[] l1, Lis[] l2) -> compareListings(l1, l2));
}
}
return;
}
if (index == 0) {
for (Sys sys : sl) {
if (!used.contains(sys.id)) {
used.add(sys.id);
for (Sta sta : sys.stations) {
for (Lis lis : sta.listings) {
if (lis.buy_price > 0 && lis.supply >= minSupDem) {
res[index] = lis;
if (sta.isPlanetary)
getAlgo2(sl, results1, results2, res, true, index + 1, n, used);
else
getAlgo2(sl, results1, results2, res, planets, index + 1, n, used);
}
}
}
used.remove(sys.id);
}
}
} else {
Lis lis1 = res[index - 1];
Sta sta1 = stations.get(lis1.station_id);
Sys sys1 = systems.get(sta1.system_id);
for (Sys sys : sl) {
if (!used.contains(sys.id)) {
used.add(sys.id);
for (Sta sta : sys.stations) {
Lis lis2 = sta.listingsMap.get(lis1.com_id);
if (lis2 != null && lis1.buy_price > 0 && lis1.buy_price < lis2.sell_price
&& lis1.supply >= minSupDem && lis2.demand >= minSupDem) {
for (Lis lis : sta.listings) {
if (lis.buy_price > 0 && lis.supply >= minSupDem) {
res[index] = lis2;
res[index + 1] = lis;
if (sta.isPlanetary)
getAlgo2(sl, results1, results2, res, true, index + 2, n, used);
else
getAlgo2(sl, results1, results2, res, planets, index + 2, n, used);
}
}
}
}
used.remove(sys.id);
}
}
}
}
//////////
int compareListings2(Lis[] a, Lis[] b) {
int sum1 = 0;
for (int i = 0; i < a.length - 1; i += 2) {
sum1 += a[i + 1].sell_price - a[i].buy_price;
}
int sum2 = 0;
for (int i = 0; i < b.length - 1; i += 2) {
sum2 += b[i + 1].sell_price - b[i].buy_price;
}
return Integer.compare(sum1, sum2);
}
Ich rufe getAlgo2 auf... und die NPE tritt hier in Zeile 111 auf (
sum1 += a[i + 1].sell_price - a[i].buy_price;
, ne es ist jetzt Zufall, dass es gerad Zeile 111 ist).Habt ihr eine Idee wieso? Wenn (index == n) dann sollte res eigentlich nicht leer sein.