Java: сравнивать / сортировать произвольные объекты - PullRequest
6 голосов
/ 11 апреля 2011

Есть ли в любом случае, я могу определить последовательность / порядок для всех объектов в JVM, так что для любых двух различных объектов o1 или o2, есть четко определенное правило, которое говорит либо o1> o2 или o2> o1 и o1 == o2 если и только если это один и тот же объект?

Сравнение identityHashCode () было бы хорошим кандидатом, если есть гарантия отсутствия столкновений (нет).

Время рождения тоже сработало бы - если бы я мог каким-то образом получить это.

Есть идеи?

Спасибо!

Ответы [ 5 ]

3 голосов
/ 11 апреля 2011

Если вы можете поддерживать свой собственный репозиторий объектов, вы можете использовать WeakHashMap<Object, Long> для поддержки своих собственных серийных идентификаторов.

2 голосов
/ 11 апреля 2011

Все, что вам нужно сделать, это определить произвольный стабильный порядок. (Ваше «время рождения объекта» одна такая идея, но я не думаю, что она хранится).

Method1: Для любых двух объектов одного и того же точного типа вы можете определить такой порядок, сравнивая их отдельные поля. Если все поля идентичны, объекты равны; если не, какое-то поле f отличается, и вы можете определить порядок на основе базового типа. Если у вас есть два объекта с разными типами, просто используйте имя типа, чтобы определить порядок; тот, чье имя лексикографически меньше, "меньше чем". Вы можете реализовать сравнение по типу (может быть, много работы), или вы можете реализовать общее сравнение использует отражение перечислять имена и типы полей (чтобы включить сравнения по типам), хотя это может будь довольно медленным.

Method2: Каждый раз, когда вы вызываете свой компаратор, кэшируйте любой объект, который еще не встречался в линейном массиве. Любые сравниваемые объекты теперь имеют индексную позицию в массиве; o1

method3: Если вы работаете с определенным подмножеством объектов, и есть канонический связующее дерево, затем нумеруйте каждый край связующего дерева так, чтобы дочерние дуги иметь уникальные номера. Тогда o1

1 голос
/ 11 апреля 2011

Вам необходимо реализовать интерфейс Comparable<YourObject> и метод compareTo(YourObject obj). Контракт метода compareTo (..) должен возвращать -1 (-ve число), когда этот объект меньше, чем объект, переданный в качестве параметра, 0, когда они равны, и +1 (+ ve число), если этот объект больше чем другой объект. Вы можете реализовать сравнение, используя любые поля, которые вам нравятся.

Использование Collections.sort () или любого list.sort () будет использовать этот компаратор для сортировки вашего списка.

Надеюсь, это поможет!

0 голосов
/ 11 апреля 2011

Метод Object.toString() должен возвращать разные значения для разных объектов в формате:

getClass().getName() + '@' + Integer.toHexString(hashCode())

Так что вы могли бы сначала сравнить в алфавитном порядке getClass (). GetName (), затем hashCode ()?

0 голосов
/ 11 апреля 2011

Если ваши объекты относятся к одному типу, вы можете запомнить их номер создания в конструкторе:

class A {
    private static long count = 0;
    private long objNumber;
    public A() {
        synchronized(A.class) {
            objNumber = count;
            count++;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...