Java >> Java tutorial >  >> Tag >> ArrayList

Søgning efter en streng i en ArrayList

1. Oversigt

I dette selvstudie vil vi se på forskellige måder at søge efter en streng i en ArrayList . Vores hensigt er at kontrollere, om en specifik ikke-tom sekvens af tegn er til stede i nogen af ​​elementerne i ArrayList og for at returnere en liste med alle de matchende elementer.

2. Basic Looping

Lad os først bruge en grundlæggende sløjfe til at søge i rækkefølgen af ​​tegn i den givne søgestreng ved hjælp af contains metode til Javas streng klasse:

public List<String> findUsingLoop(String search, List<String> list) {
    List<String> matches = new ArrayList<String>();

    for(String str: list) {
        if (str.contains(search)) {
            matches.add(str);
        }
    }

    return matches;
}

3. Streams

Java 8 Streams API giver os en mere kompakt løsning ved at bruge funktionelle operationer.

Først bruger vi filter() metode til at søge på vores inputliste efter søgestrengen, og derefter bruger vi collect metode til at oprette og udfylde en liste, der indeholder de matchende elementer:

public List<String> findUsingStream(String search, List<String> list) {
    List<String> matchingElements = list.stream()
      .filter(str -> str.trim().contains(search))
      .collect(Collectors.toList());

    return matchingElements;
}

4. Tredjepartsbiblioteker

Hvis vi ikke kan bruge Java 8 Stream API, kan vi se på tredjepartsbiblioteker såsom Commons Collections og Google Guava.

For at bruge dem skal vi blot tilføje Guava, Commons Collections eller begge afhængigheder i vores pom.xml-fil:

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>31.0.1-jre</version>
</dependency>

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.1</version>
</dependency>

4.1. Commons-samlinger

Commons Collections giver os en metode IterableUtils.filteredIterable() der matcher den givne Iterable mod et prædikat .

Lad os kalde IterableUtils.filteredIterable() , der definerer prædikatet til kun at vælge de elementer, der indeholder søgestrengen. Derefter bruger vi IteratorUtils.toList() for at konvertere den Iterable til en liste :

public List<String> findUsingCommonsCollection(String search, List<String> list) {
    Iterable<String> result = IterableUtils.filteredIterable(list, new Predicate<String>() {
        public boolean evaluate(String listElement) {
            return listElement.contains(search);
        }
    });

    return IteratorUtils.toList(result.iterator());
}

4.2. Google Guava

Google Guava tilbyder en lignende løsning som Apaches filteredIterable() med Iterables.filter() metode. Lad os bruge det til at filtrere listen og kun returnere de elementer, der matcher vores søgestreng:

public List<String> findUsingGuava(String search, List<String> list) {         
    Iterable<String> result = Iterables.filter(list, Predicates.containsPattern(search));

    return Lists.newArrayList(result.iterator());
}

5. Konklusion

I dette selvstudie har vi lært forskellige måder at søge efter en streng på i en ArrayList. Vi startede først med en simpel for loop og fortsatte derefter med en tilgang ved hjælp af Stream API. Til sidst så vi nogle eksempler på brug af to tredjepartsbiblioteker – Google Guava og Commons Collections.

De komplette eksempler er tilgængelige på GitHub.


Java tag