Хорошо, у меня есть этот фрагмент кода, который должен получить случайную запись из взвешенного списка. Тем не менее, когда я пытаюсь вызвать TreeMap.higherEntry, он возвращает ноль, даже если есть более высокая доступная запись. lowerEntry работает, floorEntry возвращает тот же ноль. Вот мой код:
import java.util.*;
public class Randomizer<E> extends ArrayList<E> {
private Random rng;
private double defaultWeight;
public Randomizer(List<E> list) {
super(list);
rng = new Random();
defaultWeight = 1.0d;
}
/*Stripped some uninteresting constructor variations for clarity*/
public void setSeed(long seed) {
rng.setSeed(seed);
}
public E getRandom() {
TreeMap<Double,E> map = new TreeMap<>();
double total = 0;
for(E e : this) {
if(e instanceof Weighted) {
map.put(((Weighted) e).getWeight(),e);
total += ((Weighted) e).getWeight();
} else {
map.put(defaultWeight,e);
total += defaultWeight;
}
System.out.println(total);
}
double value = rng.nextDouble() * total;
System.out.println(value + ", " + map.higherKey(value));
return map.higherEntry(value).getValue();
}
}
А вот вывод консоли небольшого набора данных:
5.0
9.0
11.0
14.0
15.0
15.5
19.5
22.5
24.0
26.5
27.5
28.0
9.987466924354226, null
Exception in thread "main" java.lang.NullPointerException
at me.datafox.utils.Randomizer.getRandom(Randomizer.java:52)
at me.datafox.grick.SwordTest.main(SwordTest.java:39)
Есть ли что-то, что я делаю не так? Набор данных отформатирован очень странным образом, поэтому я его опускаю, но должно быть очевидно, что вычисление итогов по списку весов - это не проблема, с которой я сталкиваюсь.