Получение указателя элемента в arraylist;
У меня есть класс под названием AuctionItem
. Класс AuctionItem
имеет метод getName()
, который возвращает String
. Если у меня есть ArrayList
типа AuctionItem
, каков наилучший способ вернуть индекс элемента в ArrayList
, который имеет определенное имя?
Я знаю, что есть функция .indexOf()
. Параметр для этой функции является объектом. Чтобы найти элемент с именем, должен ли я использовать цикл for, а когда элемент найден, верните позицию элемента в ArrayList
?
Есть ли лучший способ?
Ответы
Ответ 1
Я думаю, что для цикла должно быть допустимым решением:
public int getIndexByname(String pName)
{
for(AuctionItem _item : *yourArray*)
{
if(_item.getName().equals(pName))
return *yourarray*.indexOf(_item)
}
return -1;
}
Ответ 2
Да. Вы должны зацикливать его
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;
}
Ответ 3
В основном вам нужно найти элемент ArrayList
на основе имени getName
. Два подхода к этой проблеме:
1- Не используйте ArrayList
, используйте HashMap<String,AutionItem>
, где String
будет называться
2- Используйте getName
для создания индекса и добавления индекса на основе в список массивов list.add(int index, E element)
. Один из способов генерации индекса от имени - использовать его hashCode и modulo в ArrayList
текущем размере (что-то похожее на то, что используется внутри HashMap
)
Ответ 4
for (int i = 0; i < list.length; i++) {
if (list.get(i) .getName().equalsIgnoreCase("myName")) {
System.out.println(i);
break;
}
}
Ответ 5
Чтобы найти элемент с именем, должен ли я использовать цикл for, а когда элемент найден, верните позицию элемента в ArrayList?
Да к циклу (используя индексы или Iterator
). По возвращаемому значению либо возвращайте свой индекс, либо его элемент в зависимости от ваших потребностей. ArrayList
не имеет indexOf
(объект target, Comparator compare)` или аналогичный. Теперь, когда Java получает лямбда-выражения (в Java 8, ~ март 2014), я ожидаю, что мы увидим, что API-интерфейсы получают методы, которые принимают lambdas для таких вещей.
Ответ 6
Вы можете реализовать hashCode
/equals
вашего AuctionItem
, чтобы два из них были равны, если они имеют одинаковое имя. Когда вы это сделаете, вы можете использовать методы indexOf
и contains
для ArrayList
следующим образом: arrayList.indexOf(new AuctionItem("The name"))
. Или когда вы принимаете в методе equals, что String передается: arrayList.indexOf("The name")
. Но это не лучший дизайн.
Но я также предпочел бы использовать HashMap
для сопоставления имени с элементом.
Ответ 7
Вместо перебора грубой силы через список (например, от 1 до 10000) скорее используйте подход с итерационным поиском:
Список должен быть отсортирован с помощью проверяемого элемента.
Начните поиск по размеру среднего элемента()/2, например, 5000
если элемент поиска больше элемента на 5000, затем проверьте элемент в середине между верхней (10000) и средней (5000) - 7500
продолжайте делать это, пока не достигнете соответствия (или используйте цикл грубой силы через один раз, когда вы перейдете к меньшему диапазону (например, 20 элементов)
Вы можете найти список из 10000 примерно 13-14 тестов, а не 9999 тестов.