Сведения о вопросе

Htmlщик

06:49, 3rd August, 2020

Теги

java   algorithm    

Наложите полный порядок на все экземпляры класса *any* в Java

Просмотров: 540   Ответов: 7

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

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);
    }
}

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



  Сведения об ответе

SKY

04:28, 27th August, 2020

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

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

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


  Сведения об ответе

LIZA

22:11, 13th August, 2020

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

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

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


  Сведения об ответе

JUST___

12:26, 25th August, 2020

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

равно возвращать false, но идентификационный код hash была такой же, предположим, О1 == О2

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


  Сведения об ответе

Chhiki

03:10, 12th August, 2020

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

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

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

Поэтому, сравнивая их с третьим объектом (z), они могут в конечном итоге дать разные значения для compareTo.

В этом есть смысл?


  Сведения об ответе

+-*/

08:27, 24th August, 2020

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

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

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


  Сведения об ответе

pumpa

04:40, 23rd August, 2020

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


  Сведения об ответе

SSESION

03:13, 7th August, 2020

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться