Получение указателя элемента в 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 тестов.