Получить индекс объектов в списке Java - PullRequest
3 голосов
/ 27 февраля 2011

У меня есть список строк в моей (Android) Java-программе, и мне нужно получить индекс объекта в списке.Проблема в том, что я могу только найти документацию о том, как найти первый и последний индекс объекта.Что делать, если в моем списке 3 или более одинаковых объекта?Как найти каждый индекс?

Спасибо!

Ответы [ 3 ]

6 голосов
/ 27 февраля 2011

Вам необходимо выполнить поиск методом грубой силы:

  static <T> List<Integer> indexesOf(List<T> source, T target)
  {
     final List<Integer> indexes = new ArrayList<Integer>();
     for (int i = 0; i < source.size(); i++) {
       if (source.get(i).equals(target)) { indexes.add(i); }
     }
     return indexes;
  } 

Обратите внимание, что это не обязательно самый эффективный подход. В зависимости от контекста и типов / размеров списков, вам может потребоваться провести серьезную оптимизацию. Дело в том, что если вам нужен каждый индекс (и вы ничего не знаете о структуре содержимого списка), то вам нужно сделать смертельный марш для каждого элемента по лучшей цене O (n).

В зависимости от типа базового списка, get(i) может быть O (1) (ArrayList) или O (n) (LinkedList), поэтому это МОЖЕТ взорваться до O (n 2 ) реализация. Вы можете скопировать в ArrayList или вручную увеличить счетчик индекса LinkedList.

2 голосов
/ 27 февраля 2011

Если документация не помогает мне в моей логике в этой ситуации, я бы пошел на грубый подход для обхода списка в цикле и сохранения индекса, где я нашел совпадение

 ArrayList<String> obj = new ArrayList<String>();


 obj.add("Test Data"):  // fill the list with your data

 String dataToFind = "Hello";

 ArrayList<Integer> intArray = new ArrayList<Integer>();

 for(int i = 0 ; i<obj.size() ; i++)
 {
    if(obj.get(i).equals(dataToFind)) intArray.add(i);     
 } 

 now intArray would have contained all the index of matched element in the list
1 голос
/ 27 февраля 2011

Альтернативный метод грубой силы, который также найдет все null индексы:

static List<Integer> indexesOf(List<?> list, Object target) {
    final List<Integer> indexes = new ArrayList<Integer>();
    int offset = 0;
    for (int i = list.indexOf(target); i != -1; i = list.indexOf(target)) {
        indexes.add(i + offset);
        list = list.subList(i + 1, list.size());
        offset += i + 1;
    }
    return indexes;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...