2013-08-29 4 views
2

У меня есть список узлов связанного списка. В основном ссылки на узловые объекты. Некоторые из ссылок указывают на один и тот же объект. Теперь мой вопрос в том, как их сортировать.Как отсортировать список ссылок?

Вход:

List< node1, node3, node 4, node1, node2, node3>

Выход:

List <node1, node1, node2, node3, node3, node4>

Заказ может быть arbitraty т.е. List <node3, node3, node2, node4, node1, node1>, но зарегистрировано не менее соседние узлы должны быть рядом друг с другом.

Также обратите внимание, что сортировка не основана на «значении узла», а просто основана на ссылках на узлы.

MORE ССЫЛКА:

У меня есть карта, Map <headNode, tailNode>. Поскольку связанный список может пересекаться, карта содержит уникальные главы, но не содержит уникальных хвостов. Мое намерение состоит в том, чтобы отсортировать карту на основе «значения», а затем пройти через карту с логикой, аналогичной if (tail at pos i! = Tail @ pos i + 1), после чего 2 связанного списка пересекаются и печатают их.

+1

разместить код у вас есть для узла! Как они ссылаются? – progrenhard

+0

Вы хотите, чтобы ссылки в списке были уникальными, или ссылки на объекты уникальны. есть разница. – 75inchpianist

+0

предоставил дополнительную информацию. – JavaDeveloper

ответ

2

Вы можете сортировать на основе System.identityHashCode() значения каждого элемента в списке. Вы можете реализовать Comparator следующим образом:

enum IdentitySort implements Comparator<Node> { 
    INSTANCE; 

    @Override 
    public int compare(Node n1, Node n2) { 
     return Integer.compare(System.identityHashCode(n1), 
           System.identityHashCode(n2)); 
    } 
} 

Затем вы можете использовать Collections.sort():

Collections.sort(list, IdentitySort.INSTANCE); 
+0

System.identityHashCode может иметь коллизии (обязательно, поскольку мы сжимаем 64-разрядное адресное пространство в 32-битный хеш), поэтому его сортировка может привести к '(node1, node2, node1)', если 'node1 'и' node2' происходят с хешем с тем же. – amalloy

1

Если вы план устранить дублирующие, почему бы вам не использовать HashSet

+1

hashset будет убедиться, что записи уникальны, но не то, что объект, на который ссылаются эти ссылки, уникален. Вы можете иметь несколько уникальных ссылок на один и тот же объект, где equals() вернет true. – 75inchpianist

+0

Это не будет работать, если 'equals()' переопределяется для сравнения на основе чего-то другого, кроме ссылки. – arshajii

+0

Получил это. Благодарю. – JNL

Смежные вопросы