почему метод удаления () TreeSet не работает для целых чисел? - PullRequest
1 голос
/ 08 апреля 2020

Код выводит этот вывод -> [5, 4, 3], почему 4 все еще в наборе?

public class Temp4 {
    public static void main (String[] args)   { 
        TreeSet<Integer> set = new TreeSet<Integer>( (I1,I2)->(I1 < I2) ? 1 : (I1 > I2) ? -1 :-1);

        set.add(new Integer(5) );
        set.add(new Integer(3) );              
        set.add(new Integer(4) );

        set.remove(new Integer(4)) ;

        System.out.println( set  );

    }
}

Ответы [ 3 ]

2 голосов
/ 08 апреля 2020

Прежде всего, ваш Comparator сломан, он должен вернуть 0 для равных элементов.

Во-вторых, TreeSet использует compare для поиска элементов, в отличие от общего Set контракт.

См. здесь

Обратите внимание, что порядок, поддерживаемый набором (независимо от того, предоставляется ли явный компаратор), должен соответствовать равенствам, если это правильно реализовать интерфейс Set. (См. Comparable или Comparator для точного определения соответствия с equals.) Это так, потому что интерфейс Set определен в терминах операции equals, но экземпляр TreeSet выполняет все сравнения элементов, используя свой метод CompareTo (или сравнение), поэтому два элементы, которые считаются равными этим методом, с точки зрения множества равны. Поведение множества корректно определено, даже если его порядок не совпадает с равенством; он просто не соблюдает общий контракт интерфейса Set.

0 голосов
/ 08 апреля 2020

Следующее сравнение не работает.

TreeSet<Integer> set = new TreeSet<Integer>( (I1,I2)->(I1 < I2) ? 1 : (I1 > I2) ? -1 :-1);

Замените его на

TreeSet<Integer> set = new TreeSet<Integer>((I1, I2) -> (I1 < I2) ? 1 : (I1 > I2) ? -1 : 0);
0 голосов
/ 08 апреля 2020

Проблема в вашем компараторе, вы не обрабатываете случаи, когда объекты равны (вы должны вернуть 0). В любом случае, в вашем случае вам даже не нужно явно использовать пользовательский компаратор, вы можете создать свой набор следующим образом, и он будет работать:

TreeSet<Integer> set= new TreeSet<Integer>(Collections.reverseOrder()) ;
...