Элемент існуе ў спісе, якія маюць такое ж імя

У мяне ёсць спіс на Java. Мой клас мае поля і адзін з іх: назва . Давайце выкажам здагадку, што:

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

Так як я магу праверыць, ці ёсць элемент у спісе, які змяшчае такое ж імя з <кодам> MyElement пераменным і атрымаць гэтую пераменны?

0

5 адказы

Калі MyClass рэалізуе роўны() такім чынам, што робіць два MyClass асобнікі роўнымі, калі яны маюць аднолькавыя імёны, то вы можаце проста зрабіць:

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

На жаль, няма "атрымаць элемент, роўны() для гэтага" метаду ў Collection / List API, які можа быць рэалізаваны ў больш эфектыўным чынам.

Калі вы не ёсць такое роўны() рэалізацыі (або не хочаце гэта па нейкай прычыне), то вы будзеце мець каб зрабіць гэта сумна, старамодны спосаб:

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
3
дададзена
Проста мне цікава, што. Што лепш не выкарыстоўваць перапынак ўнутры для цыкла і выкарыстання падчас цыкла?
дададзена аўтар kamaci, крыніца
@kamaci: лепш, што паказчык? Я ня веру ў « пралом і працягнуць з'яўляюцца заўсёды зло» мантра, і ў гэтым выпадку я думаю, што гэта даволі чытаным, так што я не бачу праблемы.
дададзена аўтар Joachim Sauer, крыніца

Пры выкарыстанні Apache CollectionUtils з'яўляецца параметр, знайсці метад робіць менавіта гэта:

CollectionUtils.find(myList, new Predicate(){
  public boolean evaluate(Object o){
    return name.equals(((MyClass) o).getName());
  }
})
2
дададзена

Там нічога не убудаваны, вы павінны зрабіць гэта ўручную:

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

Гэта адна з праблем, якія лёгка адрозныя, дзе лямбда падтрымліваюцца (тут у Scala):

mylist.find(_.name == "xxx")
0
дададзена
Што знайсці вяртанне ў Scala аб'екта або індэкс? Я мяркую, што гэта аб'ект, праўда?
дададзена аўтар Joachim Sauer, крыніца
Так, ён вяртае аб'ект, а дакладней: Option - тонкая абгортка замена нулявы . Вядома, ёсць таксама indexWhere() , які вяртае індэкс першага элемента, адпаведны зададзены прэдыкатаў.
дададзена аўтар Tomasz Nurkiewicz, крыніца
Downvoter, догляд растлумачыць?
дададзена аўтар Tomasz Nurkiewicz, крыніца

Пераазначэнне Equals() метад MyClass для вяртання True , калі назва поля роўныя (String ў роўным() ).

0
дададзена
Нягледзячы на ​​тое, што б вырашыць гэтую праблему, было б адкрыць слоік з чарвякамі, калі MyClass неабходна вызначыць роўнасць на іншых/больш уласцівасцяў, чым назва .
дададзена аўтар S.L. Barth, крыніца
  1. Вы павінны перавызначыць метад Equals, каб выкарыстоўваць імя для параўнання роўнасці. Вы павінны таксама перавызначыць хэш-код() у любы час вы перавызначыць роўны() , прачытаць тут .

  2. Вы можаце выкарыстоўваць IndexOf() , каб праверыць, ці ёсць элементы, якія адпавядаюць дадзеным. Ён выкарыстоўвае роўны() :

Вось як yourlist.indexOf (о) вызначае матч:

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

Затым вы можаце зрабіць l.get (I) па індэксе (I), што вы знайшлі.

0
дададзена