Элемент существует в списке с тем же именем - PullRequest
0 голосов
/ 28 октября 2011

У меня есть список на Java. У моего класса есть поля, и одно из них: name. Предположим, что:

List<MyClass> mylist = new ArrayList<MyClass>();
MyClass myElement = new MyClass();
myElement.setName("xxx");

Так как я могу проверить, есть ли какой-либо элемент в Списке, который содержит то же имя с переменной myElement, и получить эту переменную?

Ответы [ 5 ]

3 голосов
/ 28 октября 2011

Если ваш MyClass реализует equals() таким образом, что два MyClass экземпляра равны, если они имеют одинаковое имя, то вы можете просто сделать:

int index = mylist.indexOf(myElement);
MyClass myListElement = mylist.get(index);

К сожалению, в API Collection / List нет метода «получить элемент, который является equal() этим», который мог бы быть реализован более эффективным способом.

Если у вас нет такой реализации equals() (или по какой-то причине не хотите ), вам придется делать это скучно, старомодный способ:

MyClass listElement = null;
for (MyClass mc : mylist) {
  if (myElement.getName().equals(mc.getName()) {
    listElement = mc;
    break;
  }
}
// if listElement is non-null here, then we found it
2 голосов
/ 28 октября 2011

Если используется Apache CollectionUtils - опция, метод find делает именно это:

CollectionUtils.find(myList, new Predicate(){
  public boolean evaluate(Object o){
    return name.equals(((MyClass) o).getName());
  }
})
0 голосов
/ 28 октября 2011
  1. Вы должны переопределить метод equals, чтобы использовать name для сравнения равенства.Вы также должны переопределять hashCode() каждый раз, когда переопределяете equals(), , читайте здесь .

  2. Вы можете использовать indexOf(), чтобы проверить, есть ли элементы, соответствующиеданный.Он использует equals():

Вот как yourlist.indexOf(o) определяет совпадение:

(o==null ? get(i)==null : o.equals(get(i)))

Тогда вы можете сделать l.get(i) для индекса (i)что вы нашли.

0 голосов
/ 28 октября 2011

Нет ничего встроенного, вы должны сделать это вручную:

MyClass findByNameOrNull(List<MyClass> list, String name) {
  for(MyClass myClass: list)
    if(myClass.getName().equals(name))
      return myClass;
  return null
}

Это одна из проблем, которые легко решаются, когда поддерживаются лямбды (здесь, в Scala):

mylist.find(_.name == "xxx")
0 голосов
/ 28 октября 2011

Переопределите метод equals() для MyClass, чтобы вернуть true, если поля name равны (* String's equal()).

...