Список Java: получить следующий или предыдущий элемент из идентификатора - PullRequest
10 голосов
/ 20 июня 2011

Я хочу перейти к списку по идентификатору .

1- Я управляю / создаю список.

2- Я создаю функцию для получения следующего элементаэлемент идентификатора из моего списка

Можете ли вы помочь мне исправить этот код?

Подготовить список

List<String> myList = new ArrayList<String>();
myList.add("1");
myList.add("2");
myList.add("3");
myList.add("4");
myList.add("5");


public String function getNext(String uid) {

    if (myList.indexOf(uid).hasNext()) {
        return myList.indexOf(uid).nextElement();
    }
    return "";
}

public String function getPrevious(String uid) {
    return myList.indexOf(uid).hasPrevious() ? myList.indexOf(uid).previousElement() : "";
}

Ответы [ 3 ]

12 голосов
/ 20 июня 2011

Вы можете использовать индекс для поиска вашей строки, который быстрее и проще, однако для реализации функций, которые у вас есть.

public String getNext(String uid) {
    int idx = myList.indexOf(uid);
    if (idx < 0 || idx+1 == myList.size()) return "";
    return myList.get(idx + 1);
}

public String getPrevious(String uid) {
    int idx = myList.indexOf(uid);
    if (idx <= 0) return "";
    return myList.get(idx - 1);
}

Использование List.get(i) - это O(1), что делает сохранение индексасамый быстрый вариант.List.indexOf(String) - это O(n).Использование NavigatbleSet может показаться привлекательным, поскольку оно составляет O(log n), однако стоимость создания объекта настолько высока, что коллекция должна быть достаточно большой, чтобы вы могли увидеть выгоду.(В этом случае вы бы использовали первый вариант)

1 голос
/ 20 июня 2011

Списки не имеют nextElement() метода.indexOf возвращает целочисленный индекс элемента.Вы можете просто добавить (или вычесть) один, чтобы получить следующий (или предыдущий) элемент:

public String function getNext(String uid) {
   var index = myList.indexOf(uid);
   if (index > -1) {
     try {
       return myList.get(i+1);
     } catch ( IndexOutOfBoundsException e) {
       // Ignore
     }
   }
   return ""; // consider returning `null`. It's usually a better choice.
}

Однако поиск объекта с indexOf на ArrayList является очень медленным процессом, потому что он имеетпроверить каждую запись.Есть лучшие способы для этого, но это зависит от того, чего вы на самом деле пытаетесь достичь.

1 голос
/ 20 июня 2011

Если ваши элементы не повторяются, вам нужен NavigableSet:

http://download.oracle.com/javase/6/docs/api/java/util/NavigableSet.html

Методы higher и lower - это то, что вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...