Это не ракетостроение ...
Вставьте это место вместо закомментированного кода:
if (a == null) {
return b == null ? 0 : -1;
} else if (b == null) {
return 1;
} else
Это обрабатывает null
как меньшее значение, чем любой ненулевой Double
экземпляр.
Ваша версия неверна:
if ((a==null) || (b==null)) {return -1;}
Здесь написано, что "если а равно нулю или b равно нулю, то а меньше, чем b".
Это приводит к фиктивным отношениям типа
null < 1.0 AND 1.0 < null
null < null
Подобные вещи вызывают разрушение инвариантов дерева, когда в наборе / карте есть нулевые значения, и приводят к непоследовательному и нестабильному упорядочению ключей ... и еще хуже.
Требования для действительного compare
метода изложены в javadocs . Математическая версия состоит в том, что метод должен определять общий порядок в области всех возможных входных значений.