selecteer de eerste index in de verzameling waar het leuk is

Ik voel soms dat ik het wiel opnieuw uitvind.

Ik vraag me af of er utiliteitsmethoden zijn in java/jakarta commons/guava/?, die dieper gaan in de verzameling en iets doen (testen, wijzigen, verwijderen) met de elementen.

Ik heb deze methode geschreven en nu voel ik dat er een one-liner is die dit kan.

/**
 * Find index of first line that contains search string.
 */
public static int findIdx(List list, String search) {
  for (int i = 0, n = list.size(); i < n; i++)
    if (list.get(i).contains(search))
      return i;
  return -1;
}
3
Waarom doe je voor (int i = 0, n = list.size (); i in plaats van voor (int i = 0, i ?
toegevoegd de auteur Bhesh Gurung, de bron
@Bhesh Het ziet eruit als een optimalisatie in het geval dat de bewerking size() duur is. Maar het gaat er ook van uit dat de lijstgrootte tijdens het lussen blijft staan, wat mij gevaarlijk lijkt.
toegevoegd de auteur Kevin K, de bron
Dit is mijn stijl. Ik heb niet gecontroleerd hoe duur de methode call to size() is.
toegevoegd de auteur adfgvx, de bron

2 antwoord

Guava heeft Iterables.indexOf met een predicaat:

int index = Iterables.indexOf(list, new Predicate {
        @Override public boolean apply(String input) {
            return input.contains(search);
        }
    });

Niet veel beter, weliswaar - en je moet definitief zoeken maken. Maar in ieder geval met Java 8 kun je iets schrijven als:

int index = Iterables.indexOf(list, input => input.contains(search));

(Of tenminste iets zoals dat. En mogelijk in syntaxis van een uitbreidingsmethode ...)

5
toegevoegd
Heel elegant, geen lijn maar mooi. Ik speelde eigenlijk met commons CollectionUtils.find, maar die methode geeft geen index ...
toegevoegd de auteur adfgvx, de bron

Guava heeft wat u zoekt in Iterables.indexOf() , hoewel ik niet precies zou beweren dat uw code leesbaarder wordt:

public static int findIdx(List list, final String search) {
  return Iterables. indexOf(list, new Predicate() {
    public boolean apply(String s) {
      return s.contains(search);
    }
  });
}
2
toegevoegd
Ja ... Java en functioneel programmeren spelen niet leuk. Zoveel boilerplate instantiating anonymous Functie / Predicate classes :(
toegevoegd de auteur mergeconflict, de bron
TNX voor uw gebruiksklare functie. Guava is erg krachtig, maar het is nog steeds veel typen.
toegevoegd de auteur adfgvx, de bron