2015-12-09 2 views
0

У меня есть что-то вроде этого:Java- переупорядочивая приоритет элементов в списке

public class TestItem { 

     double priority; 
     String name; 
     String phoneNumber; 

     //getter setters 
     . 
     . 
     . 

     //action 
     public void moveOrder(TestItem before, TestItem after) { 

     } 
    } 

Я хотел реализовать переназначения моего списка путем перетаскивания списка между нужными деталями. Предполагая, что это мой список.

TestItem 1 (priority = 1) 
    TestItem 2 (priority = 2) 
    TestItem 3 (priority = 3) 
    TestItem 4 (priority = 4) 
    TestItem 5 (priority = 5) 

Если я хочу, чтобы переместить TestItem 4 в диапазоне от 1 до 2, она будет так:

TestItem 1 (priority = 1) 
    TestItem 4 (priority = 1.5) 
    TestItem 2 (priority = 2) 
    TestItem 3 (priority = 3) 

    TestItem 5 (priority = 5) 

TestItem 4 в порядок в среднем на 1 и 2. Моя проблема когда я продолжайте переупорядочивать, стоимость заказа становится меньше.

У меня еще нет идеи относительно того, как исправить каждый раз, когда он достигает чего-то значения. Возможно, мне нужно снова вернуть весь список? Есть ли ссылка на что-то подобное?

Любое предложение или ссылки приветствуются.

+1

Вы читали о 'Collections.sort()' с помощью 'Comparator'? https://docs.oracle.com/javase/6/docs/api/java/util/Collections.html#sort%28java.util.List,%20java.util.Comparator%29 – vikingsteve

+0

Что вы подразумеваете под " значение порядка становится меньше "и" как исправить, когда он достигает чего-то значения "? Неясно, что «неправильно» о том, что вы описываете. –

+0

Когда последний элемент будет перемещен в цикле в позицию 1 (индекс на основе 0), приоритеты будут 1.5, 1.25, 1.125, ... и вскоре он достигнет проблемы с точностью ... – Betlista

ответ

0

Если вы ищете способ сортировки сортировки массива, это простое решение, которое может работать. https://en.wikipedia.org/wiki/Selection_sort

И убедитесь, что вы переназначить приоритет, а не индекс

public void moveOrder(TestItem before, TestItem after) { 
    this.priority = (before.priority + after.priority)/2.0; 
} 

Надежда это помогает, Шон

0

Это зависит от того, что вы хотите достичь на самом деле.

Division так плохо, как перемножения, который вы будете видеть легче может вытечь ...

TestItem 1 (priority = 1) 
TestItem 2 (priority = 2) 
TestItem 3 (priority = 3) 
TestItem 4 (priority = 4) // move this between 1 and 2 
TestItem 5 (priority = 5) 

является сумма нечетная, умножить все на 2, что приведет к

TestItem 1 (priority = 2) // *2 
-> TestItem 4 (priority = 3) // (2+4)/2 
    TestItem 2 (priority = 4) // *2 
    TestItem 3 (priority = 6) // *2 
    //TestItem 4 (priority = 4) original position 
    TestItem 5 (priority = 10) // *2 

но вам нужно получить доступ ко всем пунктам в списке, если вы можете это сделать, просто увеличите приоритет для тех, которые после новой позиции

TestItem 1 (priority = 1) 
-> TestItem 4 (priority = 2) // 1 + 1 
    TestItem 2 (priority = 3) 
    TestItem 3 (priority = 4) 
    //TestItem 4 (priority = 4) original position 
    TestItem 5 (priority = 5) // prev. priority + 1 
+0

На самом деле я стараюсь избегать доступа ко всем пунктам моего списка как можно больше. и получил вид реализации от [фабрикатора] (https://github.com/phacility/phabricator/blob/a1ccee8c242e74aa35c245e3d8da206f3c48b16f/src/applications/maniphest/editor/ManiphestTransactionEditor.php), но я запутался в том, как он получил исправление. – elL

+1

Проведите некоторое тестирование, если возможно, возможно, он этого не сделал ;-) Сколько ожидается количество элементов в вашем списке? Если это 1000, мне было бы неинтересно ;-) – Betlista

+0

плохой, потому что количество ходов ограничено мощностью 2, которая соответствует типу приоритета -double, поэтому в худшем случае может поддерживать до 32 ходов. – aviad

-1

Я бы использовал Priority Queue и его методы remove и add.

EDIT

В случае, если необходимо сохранить ссылку на конкретный элемент в любой момент времени, то имея Hashmap с номером телефона в качестве ключа и ссылку на соответствующий элемент очереди приоритетов как значение будет делать магию. Когда вам нужно переупорядочить, вы выбираете 3 элемента из пользовательского интерфейса (я думаю), то вы находите их в O (1) на Hashmap и, наконец, у вас есть все приоритеты, которые вам нужны. Вам нужно будет изменить приоритет перемещаемого элемента. Вам не нужно беспокоиться об обновлении ссылок в HashMap - он будет всегда обновляться.

Пример: Список = х, у, г Вы должны переместить х между у и г, так что список выглядит как у, х, г. Вы найдете x, y и z, выполнив поиск по Hashmap, используя свои номера телефонов. то новый приоритет х является:

р (х) = р (г) -п (у) /2.0

Я предполагаю, что все приоритеты являются положительными doubles. Теперь ваш список переупорядочен.

Удачи!

+0

В Priority Queue нет индексов, есть только элемент min/max, как вы хотите переместить элемент на третью позицию? – Betlista

+0

по приоритету. если вы хотите переместить x между y и z в списке, тогда p (x) = p (z) -p (y) /2.0 – aviad

+0

, но в очереди с приоритетом вы не знаете предыдущего и следующего элемента ... – Betlista