2013-05-06 2 views
12

У меня есть класс под названием AuctionItem. Класс AuctionItem имеет метод, называемый getName(), который возвращает String. Если у меня есть ArrayList типа AuctionItem, каков наилучший способ вернуть индекс элемента в ArrayList, который имеет определенное имя?Получение указателя элемента в arraylist;

Я знаю, что есть функция .indexOf(). Параметр для этой функции является объектом. Чтобы найти элемент с именем, должен ли я использовать цикл for, и когда элемент найден, верните позицию элемента в ArrayList?

Есть ли лучший способ?

ответ

0

Чтобы найти элемент с именем, должен ли я использовать цикл for, а когда элемент найден, верните позицию элемента в ArrayList?

Да к петле (с использованием индексов или Iterator). По возвращаемому значению либо возвращайте свой индекс, либо его элемент в зависимости от ваших потребностей. ArrayList не имеет indexOf (Цель объекта, Comparator сравнение) `или аналогичный. Теперь, когда Java получает лямбда-выражения (в Java 8, ~ март 2014 года), я ожидаю, что мы увидим, что API-интерфейсы получают методы, которые принимают lambdas для таких вещей.

9

Yes.you должны кольцую

public int getIndex(String itemName) 
{ 
    for (int i = 0; i < arraylist.size(); i++) 
    { 
     AuctionItem auction = arraylist.get(i); 
     if (itemName.equals(auction.getname())) 
     { 
      return i; 
     } 
    } 

    return -1; 
} 
5

В основном вам нужно будет искать ArrayList элемент на основе имени getName. Два подхода к этой проблеме:

1- Не используйте ArrayList, используйте HashMap<String,AutionItem> где String бы назвать

2- Использование getName для создания индекса и использовать сложение на основе индекса в списке массива list.add(int index, E element). Один из способов для создания индекса от имени будет использовать его хэш-код и по модулю по ArrayList текущему размеру (что-то подобное тому, что используется внутри HashMap)

+1

+1 для использования HashMap – Kai

1
for (int i = 0; i < list.length; i++) { 
    if (list.get(i) .getName().equalsIgnoreCase("myName")) { 
    System.out.println(i); 
    break; 
    } 
} 
14

Я думаю, что для петли должен быть допустимым решением:

public int getIndexByname(String pName) 
    { 
     for(AuctionItem _item : *yourArray*) 
     { 
      if(_item.getName().equals(pName)) 
       return *yourarray*.indexOf(_item) 
     } 
     return -1; 
    } 
0

Вы можете реализовать hashCode/equals вашего AuctionItem, так что два из них равны, если они имеют одинаковое имя. Когда вы это сделаете, вы можете использовать методы indexOf и containsArrayList следующим образом: arrayList.indexOf(new AuctionItem("The name")). Или когда вы принимаете в методе equals, что String передается: arrayList.indexOf("The name"). Но это не лучший дизайн.

Но я также предпочел бы использовать HashMap, чтобы нанести на карту имя.

0

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

поиск Начало в размере среднего элемента()/2, например, 5000 если поиск элемент больше, чем элемент на 5000, а затем проверить элемент в средней точке между верхним (10000) и медианы (5000) - 7500

продолжайте делать это до тех пор, пока не достигнете соответствия (или используйте цикл грубой силы после того, как вы перейдете к меньшему диапазону (например, 20 предметов)

Вы можете найти список из 10000 примерно 13-14 тестов, а не потенциально 9999 тестов.

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