Метод TreeSet.lower() не возвращает требуемый вывод при использовании явного конструктора компаратора

#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 значение for 11 , следовательно, это значение, возвращаемое 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, но я, возможно, слишком много читаю об этом.