переупорядочить список в Java


У меня есть три способа переупорядочения списка (думаю, бейсбол порядке) и я уверен, вы можете придумать больше. Что является лучшим способом?

Например, если входной список 1,2,3,4 и тока 3, то результат должен быть 3,4,1,2. Другой пример списка: 1,2,3,4 и тока 4 вывода 4,1,2,3.

public void reOrder(List<String> list, String current) {

        if (list.size() > 1) {
            for (int i = 0; i < list.size(); i++) {
                String host = list.remove(0);
                if (host.equals(current)) {
                    list.add(0, host);
                    break;
                }
                list.add(host);

            }
        }
    }

   public void reOrder2(List<String> list, String current) {

        if (list.size() > 1) {
            int indexOfWorkingHost = list.indexOf(current);
            if (indexOfWorkingHost != -1) {
                for (int i = 0; i < indexOfWorkingHost; i++) {
                    list.add(list.remove(0));
                }
            }
        }
    }

public void reOrder3(List<String> list, String current) {

    if (list.size() > 1) {
        List<String> tmpServers = new ArrayList<String>();
        tmpServers.addAll(list);
        for (String host : tmpServers) {
            if (host.equals(current)) {
                break;
            }
            String first = list.remove(0);
            list.add(first);
        }
    }
}


7734
2
задан 12 октября 2011 в 07:10 Источник Поделиться
Комментарии
2 ответа

Первое, что вам нужно сделать, это определить, что вы подразумеваете с "лучшей". Быстрый казнить? Самый читаемый? Лучшие Java-Несс?

В любом случае ни одно из решений не очень "хороший". Первый неоправданно удаляет "текущего" элемента и повторно добавляет он, второй использует метод indexOf, таким образом косвенно имеет две петли, и, наконец, третий создает копию списка, который еще медленнее.

При использовании "низкого уровня" удаление/добавление и модификация исходного списка, я думаю, сделал бы примерно так (непроверенных):

public void reOrder(List<String> list, String current) {
int i = list.length;
while (i-- > 0 && list.get(0) != current)
list.add(list.remove(0));
}

(Кстати, подумать об использовании дженериков: публичный недействительным порядок(список список, Т текущая) {...)

Существует также API-интерфейса Java функция, которая делает это (коллекций.поворот), но это требует индекс "текущего" элемента. Если у вас есть "лучше" или более оптимизирован зачем вам индекс, кроме "слева направо" поиск помощи indexOf (например, двоичный поиск или карту), то это будет лучшим решением.

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

Если скорость действительно практическая проблема для вас, тогда другое дело, вы должны проверить, если вам действительно нужно, чтобы изменить порядок в списке. Есть несколько способов для того, чтобы создать "вид" в списке в нужном порядке, что в принципе принимают практически никакого дополнительного времени (особенно это будет независимо от длины списка) для создания и использования.

2
ответ дан 13 октября 2011 в 01:10 Источник Поделиться

Так как есть тока, я представляю, как это сделать через итератор.

Что-то между строк:

for (Iterator<T> i = list.iterator(); i.hasNext(); ){
if (current.equals(i.next()){
i.remove();
list.add(0, current);
break;
}
}

Код отлично работает для класса LinkedList, но LinkLists делать сосать очень плохой б/у для косвенного обращения на каждой итерации (сильно кэша склонен). Коллекции (и массив задние) будут выставлять 2 раза систему.arrayCopy но они лучше типа списка большую часть времени, и последнее, но не менее вы, возможно, пожелает взглянуть на ArrayDequeu.

В любом случае это лучший способ, чтобы сделать с точки зрения скорости и читабельности.

1
ответ дан 13 октября 2011 в 03:10 Источник Поделиться