#java #collections #treeset
Вопрос:
Я использую явный компаратор, чтобы разрешить дублирование значений в наборе деревьев. При извлечении точного нижнего значения для заданного значения с помощью метода TreeSet.lower() я получаю результат, аналогичный заданному значению (аргумент внутри метода TreeSet.lower ())
import java.util.*;
public class GFG {
public static void main(String args[])
{
TreeSet<Integer> tree = new TreeSet<Integer>(new Comparator<Integer>(){
@Override
public int compare(Integer a, Integer b){
if(a >= b){
return 1;
}else{
return -1;
}
}
});
// Add elements to this TreeSet
tree.add(9);
tree.add(5);
tree.add(8);
tree.add(1);
tree.add(11);
tree.add(3);
System.out.println(tree.lower(11));
}
}
Вот дерево.опустите(11), возвращая 11 вместо 9.
Комментарии:
1.
lower()
Метод, скорее всего, полагается на компаратор и ожидает, что он будет подчиняться контракту (это означает, что компаратор возвращает » отрицательное целое число, ноль или положительное целое число, поскольку первый аргумент меньше, равен или больше второго «). Ваш компаратор возвращает1
значение for11
, следовательно, это значение, возвращаемое lower.2. Ваш компаратор недействителен, поэтому не ожидайте, что дерево будет работать правильно. И нет, вы не можете написать допустимый компаратор, который допускает дубликаты.
3. tl;dr : если ваш компаратор никогда не возвращается
0
, значит, это неправильно.
Ответ №1:
В определении lower вы найдете строго меньше, чем данный элемент. Компаратор возвращает 1 при строго меньшем значении. Ваш компаратор возвращает 1 также для равенства. Таким образом, набор деревьев считает равенство строго меньшим, следовательно, — учитывая ваш компаратор — 11 строго меньше 11.
В качестве альтернативы вы можете использовать сортированный список вместо набора деревьев, если хотите хранить дубликаты.
Комментарии:
1. Возврат 1 означает, что первый аргумент больше второго параметра, поэтому 11 > 11, но поскольку предполагается, что компаратор действителен, 11 >> 11 подразумевает 11 >>< 11, используя правило
sgn(compare(x, y)) == -sgn(compare(y, x))
. Я думаю, что это могло бы объяснить, почемуlower
возвращается 11, но я, возможно, слишком много читаю об этом.