Вводить полное упорядочение всех экземпляров * любой * класса в Java

голоса
3

Я не уверен, будет ли следующий код обеспечить все условия, указанные в Javadoc компаратора.

class TotalOrder<T> implements Comparator<T> {

    public boolean compare(T o1, T o2) {
        if (o1 == o2 || equal(o1, o2)) return 0;

        int h1 = System.identityHashCode(o1);
        int h2 = System.identityHashCode(o2);

        if (h1 != h2) {
            return h1 < h2 ? -1 : 1;
        }

        // equals returned false but identity hash code was same, assume o1 == o2
        return 0;
    }

    boolean equal(Object o1, Object o2) {
        return o1 == null ? o2 == null : o1.equals(o2);
    }
}

Будет выше код ввести полное упорядочение всех экземпляров любого класса, даже если этот класс не реализует Сопоставимым?

Задан 26/08/2008 в 16:11
источник пользователем
На других языках...                            


7 ответов

голоса
2

Эй, смотри, что я нашел!

http://gafter.blogspot.com/2007/03/compact-object-comparator.html

Ах да, я забыл о IdentityHashMap (Java 6 и выше только). Просто надо обратить внимание на отпуская компаратор.

Ответил 26/08/2008 в 17:08
источник пользователем

голоса
2

Эй, смотри, что я нашел!

http://gafter.blogspot.com/2007/03/compact-object-comparator.html

Это именно то, что я искал.

Ответил 26/08/2008 в 17:03
источник пользователем

голоса
1

Вы , вероятно , следует вызвать исключение , если он попадает в этой последней return 0строке --когда хэш столкновение происходит. У меня есть вопрос , хотя вы делаете полный порядок на хэш, который я думаю это хорошо, но не какой - то функции передаются ему определить лексикографический порядок?

    int h1 = System.identityHashCode(o1);
    int h2 = System.identityHashCode(o2);
    if (h1 != h2) {
        return h1 < h2 ? -1 : 1;
    }

Я могу себе представить, что у вас есть объекты, как кортеж из двух целых чисел, которые образуют вещественное число. Но вы не получите правильный порядок, так как вы только принимая хэш объекта. Это все зависит от вас, если хэширования, что вы имели в виду, но для меня это не имеет особого смысла.

Ответил 26/08/2008 в 16:44
источник пользователем

голоса
1

Я не думаю, что это делает, так как это условие не выполнено:

Наконец, реализатор должен гарантировать, что x.compareTo (у) == 0 означает, что SGN (x.compareTo (г)) == SGN (y.compareTo (г)), для всех г.

С равным (o1, o2) зависит от реализации O1 в равноправный, двух объектов, которые логически равны (как определено равными) еще два differrent identityHashCodes.

Таким образом, при сравнении их с третьим объектом (г), они могут в конечном итоге получают различные значения для CompareTo.

Смысл?

Ответил 26/08/2008 в 16:32
источник пользователем

голоса
1

Вы ответили на ваш комментарий:

равно возвращается ложным, но идентичность хэш-код был такой же, предположим, что o1 == o2

К сожалению, вы не можете предположить, что. Большую часть времени, которая будет работать, но в некоторых случаях exceptionnal, это не будет. И вы не можете знать, когда. При появлении такого случая, то это привело бы потерять экземпляры в TreeSets, например.

Ответил 26/08/2008 в 16:20
источник пользователем

голоса
0

Я согласен, это не идеально, поэтому комментарий. Какие-либо предложения?

Я думаю, что сейчас, как вы можете решить, что, потому что вы не можете получить доступ к одному и только одно, что можно выделить два экземпляра: их адрес в памяти. Так что у меня есть только одно предложение: пересмотреть свою потребность иметь общий общий процесс упорядочения в Java :-)

Ответил 26/08/2008 в 16:51
источник пользователем

голоса
0

Я не совсем уверен , о System.identityHashCode(Object). Это довольно много , что == используется. Вы могли бы , а хотите использовать Object.hashCode()- это более параллельно Object.equals(Object).

Ответил 26/08/2008 в 16:35
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more