Использование indexOf, но с членом класса, содержащегося в списке - PullRequest
2 голосов
/ 08 декабря 2011

Мне было что-то интересно. Если у меня есть такой класс:

public class OrderItem {
    private Item item;
    private int quantity;
    private BigDecimal total;
}

А у меня в классе Chart а List<OrderItem> orders. OrderItem идентифицируется по item, так что я подумал, что если есть метод orders, я могу ovveride (возможно, indexOf), чтобы проверить, существует ли OrderItem, а затем получить его (или его индекс)

Я говорю о чем-то отличном от использования цикла for и проверки его элемента. Может быть, интерфейс?

edit : Извините, что ввел в заблуждение вопрос, я забыл важную часть. Мне нужно получить объект.

Ответы [ 2 ]

3 голосов
/ 08 декабря 2011

Вы можете использовать метод contains() для List, если переопределите метод equals() для OrderItem

Из документации на contains():

Возвращает true, если этот список содержит указанный элемент. Более формально, возвращает true тогда и только тогда, когда этот список содержит хотя бы один элемент e такой, что (o == null? E == null: o.equals (e)).

В пределах вашего переопределения equals сравните ваши Item s и при необходимости верните true / false. Если вы переопределите equals(), вам также следует переопределить hashcode().

РЕДАКТИРОВАТЬ: в ответ на комментарий вышеизложенное относится и к indexOf() - после того, как вы введете equals(), индекс также будет работать так же, как contains(). Просто предоставьте ему экземпляр OrderItem, содержащий тот же Item, и вы вернете индекс в списке соответствующих OrderItem (если есть), который затем можно будет использовать для доступа к нему.

2 голосов
/ 08 декабря 2011

Over-ride .equals() и .hashcode() в OrderItem, поэтому равенство определяется item.

Затем можно вызвать indexOf(dummyOrderItem), где dummyOrderItem - фиктивный объект, созданный с правильнымitem.Затем вы можете вызвать get (index) для получения истинного объекта.

Если вы используете Eclipse, вы можете генерировать эти методы автоматически, используя source->generate hashCode() and equals():

@Override
public int hashCode()
{
    final int prime = 31;
    int result = 1;
    result = prime * result + ((item == null) ? 0 : item.hashCode());
    return result;
}
@Override
public boolean equals(Object obj)
{
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    OrderItem other = (OrderItem) obj;
    if (item == null)
    {
        if (other.item != null)
            return false;
    }
    else if (!item.equals(other.item))
        return false;
    return true;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...