Come determinare se un array contiene un valore particolare in Java?


2279

Ho un String[] valore con così:

public static final String[] VALUES = new String[] {"AB","BC","CD","AE"};

Dato String s, c'è un buon modo per testare se VALUEScontiene s?


5
Molto lontano, ma puoi usare un ciclo for: "for (String s: VALUES) if (s.equals (" MYVALUE ")) restituisce true;
Zack,

70
@camickr. Alla tua domanda, ho annullato questa domanda e la tua risposta - ora - perché mi ha fatto risparmiare 30 minuti e 20 righe di codice scrivendo brutti per i loop, - ora -. Non l'ho letto tre anni fa. (A proposito, grazie :))
Inseguimento

3
@ camickr - Ho una situazione quasi identica a questa: stackoverflow.com/a/223929/12943 Continua a ottenere voti ma era solo una copia / incolla dalla documentazione di Sun. Immagino che il punteggio si basi su quanto aiuto hai fornito e non su quanto sforzo ci metti, e soprattutto quanto velocemente lo pubblichi! Forse ci siamo imbattuti nel segreto di John Skeet! Bene buona risposta, +1 per te.
Bill K,

1
Se stai usando Apache Commons, org.apache.commons.lang.ArrayUtils.contains () fa questo per te.
Mr. Boy,

34
@camickr perché le persone, come me, google una domanda, fanno clic sul risultato SO, vedono la tua risposta, la testano, funziona, votano la risposta e poi vanno via.
Aequitas,

Risposte:


2925
Arrays.asList(yourArray).contains(yourValue)

Attenzione: questo non funziona con le matrici di primitivi (vedere i commenti).


Da ora puoi usare gli stream.

String[] values = {"AB","BC","CD","AE"};
boolean contains = Arrays.stream(values).anyMatch("s"::equals);

Per verificare se una matrice di int, doubleo longcontiene un valore IntStream, utilizzare DoubleStreamo LongStreamrispettivamente.

Esempio

int[] a = {1,2,3,4};
boolean contains = IntStream.of(a).anyMatch(x -> x == 4);

87
Sono un po 'curioso delle prestazioni di questo rispetto alle funzioni di ricerca nella classe Arrays rispetto all'iterazione su un array e all'utilizzo di una funzione equals () o == per le primitive.
Thomas Owens,

186
Non perdi molto, poiché asList () restituisce un ArrayList che ha un array al centro. Il costruttore cambierà solo un riferimento, quindi non c'è molto lavoro da fare lì. E contiene () / indexOf () ripeterà e utilizzerà equals (). Per i primitivi, però, dovresti fare meglio a codificarlo da solo. Per le stringhe o altre classi, la differenza non sarà evidente.
Joey,

18
Strano, NetBeans afferma che 'Arrays.asList (holidays)' per un 'int [] holidays' restituisce un 'list <int []>', e non un 'list <int>'. Contiene solo un singolo elemento. Significa che Contiene non funziona poiché ha solo un elemento; l'array int.
Nyerguds,

62
Nyerguds: in effetti, questo non funziona per i primitivi. In java i tipi primitivi non possono essere generici. asList è dichiarato come <T> Elenco <T> asList (T ...). Quando si passa un int [] al suo interno, il compilatore genera T = int [] perché non può inferire T = int, perché le primitive non possono essere generiche.
CromTheDestroyer,

28
@Joey solo una nota a margine, è un ArrayList, ma non java.util.ArrayListcome ci si aspetta, la vera classe restituito è: java.util.Arrays.ArrayList<E>definito come: public class java.util.Arrays {private static class ArrayList<E> ... {}}.
TWiStErRob,

363

Aggiornamento conciso per Java SE 9

Le matrici di riferimento sono errate. Per questo caso stiamo cercando un set. Dal momento che Java SE 9 abbiamo Set.of.

private static final Set<String> VALUES = Set.of(
    "AB","BC","CD","AE"
);

"Dati String s, c'è un buon modo per testare se VALUES contiene s?"

VALUES.contains(s)

O (1).

Il tipo giusto , immutabile , O (1) e conciso . Bellissimo.*

Dettagli della risposta originale

Giusto per cancellare il codice fino all'inizio. Abbiamo (corretto):

public static final String[] VALUES = new String[] {"AB","BC","CD","AE"};

Questa è una statica mutabile che FindBugs ti dirà che è molto cattiva. Non modificare la statica e non consentire ad altri codici di farlo. Come minimo assoluto, il campo dovrebbe essere privato:

private static final String[] VALUES = new String[] {"AB","BC","CD","AE"};

(Nota, puoi effettivamente rilasciare il new String[];bit.)

Le matrici di riferimento sono ancora errate e vogliamo un set:

private static final Set<String> VALUES = new HashSet<String>(Arrays.asList(
     new String[] {"AB","BC","CD","AE"}
));

(Le persone paranoiche, come me, potrebbero sentirsi più a proprio agio se questo fosse avvolto Collections.unmodifiableSet- potrebbe anche essere reso pubblico.)

(* Per essere un po 'più sul marchio, l'API delle collezioni è prevedibilmente ancora priva di tipi di raccolta immutabili e la sintassi è ancora troppo prolissa, per i miei gusti.)


184
Tranne che è O (N) a creare la collezione in primo luogo :)
Drew Noakes

61
Se è statico, probabilmente verrà usato parecchie volte. Quindi, il tempo impiegato per inizializzare il set ha buone probabilità di essere piuttosto piccolo rispetto al costo di molte ricerche lineari.
Xr.

1
La creazione della raccolta sarà dominata dal tempo di caricamento del codice (che è tecnicamente O (n) ma praticamente costante).
Tom Hawtin: affronta il

2
@ TomHawtin-tackline Perché dici "in particolare qui vogliamo un set"? Qual è il vantaggio di un set (HashSet) in questo caso? Perché un "array di riferimento" è errato (per "array di riferimento" si intende un ArrayList supportato da un array generato da una chiamata a Arrays.asList)?
Basil Bourque,

6
@nmr A TreeSetsarebbe O(log n). HashSetgli s sono ridimensionati in modo tale che il numero medio di elementi in un bucket sia approssimativamente costante. Almeno per array fino a 2 ^ 30. Potrebbero esserci effetti, per esempio, cache hardware che l'analisi big-O ignora. Suppone inoltre che la funzione hash funzioni in modo efficace.
Tom Hawtin - tackline

206

È possibile utilizzare ArrayUtils.containsda Apache Commons Lang

public static boolean contains(Object[] array, Object objectToFind)

Si noti che questo metodo restituisce falsese l'array passato è null.

Ci sono anche metodi disponibili per array primitivi di tutti i tipi.

Esempio:

String[] fieldsToInclude = { "id", "name", "location" };

if ( ArrayUtils.contains( fieldsToInclude, "id" ) ) {
    // Do some stuff.
}

4
@ max4ever Sono d'accordo, ma questo è ancora meglio di "rotolare il tuo" e più facile da leggere quindi il modo java crudo.
Jason,


38
@ max4ever A volte questa libreria è già inclusa (per altri motivi) ed è una risposta perfettamente valida. Lo stavo cercando e già dipendo da Apache Commons Lang. Grazie per questa risposta
GuiSim,

1
Oppure potresti semplicemente copiare il metodo (e le dipendenze se ce ne sono).
Buffalo,

10
@ max4ever La maggior parte delle app Android è minimizzata da Proguard, inserendo solo le classi e le funzioni necessarie nella tua app. Ciò rende uguale a te stesso, o copia la fonte della cosa apache. E chi non usa questa minimizzazione non deve lamentarsi di 700kb o 78kb :)
Kenyakorn Ketsombut

158

Basta semplicemente implementarlo a mano:

public static <T> boolean contains(final T[] array, final T v) {
    for (final T e : array)
        if (e == v || v != null && v.equals(e))
            return true;

    return false;
}

Miglioramento:

La v != nullcondizione è costante all'interno del metodo. Valuta sempre allo stesso valore booleano durante la chiamata del metodo. Quindi, se l'input arrayè grande, è più efficiente valutare questa condizione una sola volta e possiamo usare una condizione semplificata / più veloce all'interno del forloop in base al risultato. Il contains()metodo migliorato :

public static <T> boolean contains2(final T[] array, final T v) {
    if (v == null) {
        for (final T e : array)
            if (e == null)
                return true;
    } 
    else {
        for (final T e : array)
            if (e == v || v.equals(e))
                return true;
    }

    return false;
}

9
@Phoexo Questa soluzione è ovviamente più veloce perché la risposta accettata avvolge l'array in un elenco e chiama il metodo Includes () su quell'elenco mentre la mia soluzione sostanzialmente fa ciò che contiene () farebbe solo.
Icza,

10
@AlastorMoody e == v esegue un controllo di uguaglianza di riferimento che è molto veloce. Se lo stesso oggetto (lo stesso per riferimento) si trova nell'array, verrà trovato più velocemente. Se non è la stessa istanza, potrebbe comunque essere la stessa richiesta dal metodo equals (), questo è ciò che viene verificato se i riferimenti non sono gli stessi.
Icza,

20
Perché questa funzione non fa parte di Java? Non c'è da meravigliarsi se la gente dice che Java è gonfio ... guarda tutte le risposte sopra che usano un sacco di librerie quando tutto ciò che ti serve è un ciclo for. Ragazzi in questi giorni!
phreakhead

4
@phreakhead Fa parte di Java, vediCollection.contains(Object)
Steve Kuo,

11
@icza Se guardi la fonte di Arrayse ArrayListrisulta che questo non è necessariamente più veloce della versione che utilizza Arrays.asList(...).contains(...). Il sovraccarico di creazione di un ArrayListè estremamente piccolo e ArrayList.contains()utilizza un loop più intelligente (in realtà utilizza due loop diversi) rispetto a quello mostrato sopra (JDK 7).
Axel,

72

Quattro modi diversi per verificare se un array contiene un valore

1) Utilizzo dell'elenco:

public static boolean useList(String[] arr, String targetValue) {
    return Arrays.asList(arr).contains(targetValue);
}

2) Utilizzando Set:

public static boolean useSet(String[] arr, String targetValue) {
    Set<String> set = new HashSet<String>(Arrays.asList(arr));
    return set.contains(targetValue);
}

3) Utilizzando un semplice ciclo:

public static boolean useLoop(String[] arr, String targetValue) {
    for (String s: arr) {
        if (s.equals(targetValue))
            return true;
    }
    return false;
}

4) Utilizzo di Arrays.binarySearch ():

Il codice seguente è errato, è elencato qui per completezza. binarySearch () può essere utilizzato SOLO su array ordinati. Di seguito troverai il risultato strano. Questa è l'opzione migliore quando l'array viene ordinato.

public static boolean binarySearch(String[] arr, String targetValue) {  
            int a = Arrays.binarySearch(arr, targetValue);
            return a > 0;
        }

Esempio rapido:

String testValue="test";
String newValueNotInList="newValue";
String[] valueArray = { "this", "is", "java" , "test" };
Arrays.asList(valueArray).contains(testValue); // returns true
Arrays.asList(valueArray).contains(newValueNotInList); // returns false

5
il tuo esempio di ricerca binaria dovrebbe restituire un> 0;
Will Sherwood,

6
Perché? Penso che dovrebbe restituire un> -1, poiché 0 indicherebbe che è contenuto in testa alla matrice.
sotto

1
La prima variante con (a >= 0)era corretta, basta controllare i documenti , dicono "Nota che questo garantisce che il valore di ritorno sarà> = 0 se e solo se viene trovata la chiave".
Yoory N.

Perché funziona su String e non su int? esiste un valore booleano statico (int [] ints, int k) {return Arrays.asList (ints) .contains (k); }
Willians Martins

71

Se l'array non è ordinato, dovrai scorrere su tutto ed effettuare una chiamata uguale a ciascuno.

Se l'array è ordinato, è possibile eseguire una ricerca binaria, ce n'è uno nella classe Array .

In generale, se hai intenzione di fare molti controlli di appartenenza, potresti voler archiviare tutto in un set, non in un array.


1
Inoltre, come ho detto nella mia risposta, se si utilizza la classe Arrays, è possibile ordinare l'array e quindi eseguire la ricerca binaria sull'array appena ordinato.
Thomas Owens,

1
@Thomas: sono d'accordo. Oppure puoi semplicemente aggiungere tutto in un TreeSet; stessa complessità. Vorrei usare gli array se non cambia (forse salvare un po 'di località di memoria poiché i riferimenti si trovano contigui sebbene le stringhe non lo siano). Userei il set se questo dovesse cambiare nel tempo.
Uri,

49

Per quello che vale ho eseguito un test confrontando i 3 suggerimenti per la velocità. Ho generato numeri interi casuali, li ho convertiti in una stringa e li ho aggiunti a un array. Ho quindi cercato il numero / stringa più alto possibile, che sarebbe uno scenario peggiore per il asList().contains().

Quando si utilizzava una dimensione di array di 10 K i risultati erano:

Ordina e cerca: 15
Ricerca binaria: 0
asList.contains: 0

Quando si utilizza un array da 100 K i risultati sono stati:

Ordina e cerca: 156
Ricerca binaria: 0
asList.contains: 32

Quindi, se l'array viene creato in ordine, la ricerca binaria è la più veloce, altrimenti asList().containssarebbe la strada da percorrere. Se hai molte ricerche, potrebbe essere utile ordinare l'array in modo da poter usare la ricerca binaria. Tutto dipende dalla tua applicazione.

Penso che questi siano i risultati che la maggior parte della gente si aspetterebbe. Ecco il codice di prova:

import java.util.*;

public class Test
{
    public static void main(String args[])
    {
        long start = 0;
        int size = 100000;
        String[] strings = new String[size];
        Random random = new Random();


        for (int i = 0; i < size; i++)
            strings[i] = "" + random.nextInt( size );

        start = System.currentTimeMillis();
        Arrays.sort(strings);
        System.out.println(Arrays.binarySearch(strings, "" + (size - 1) ));
        System.out.println("Sort & Search : " + (System.currentTimeMillis() - start));

        start = System.currentTimeMillis();
        System.out.println(Arrays.binarySearch(strings, "" + (size - 1) ));
        System.out.println("Search        : " + (System.currentTimeMillis() - start));

        start = System.currentTimeMillis();
        System.out.println(Arrays.asList(strings).contains( "" + (size - 1) ));
        System.out.println("Contains      : " + (System.currentTimeMillis() - start));
    }
}

6
Non capisco questo codice. Si ordina l'array 'stringhe' e si utilizza lo stesso array (ordinato) in entrambe le chiamate a binarySearch. Come può mostrare tutto tranne l'ottimizzazione del runtime di HotSpot? Lo stesso con la chiamata asList.contains. Si crea un elenco dall'array ordinato e quindi contiene su di esso con il valore più alto. Ovviamente ci vorrà del tempo. Qual è il significato di questo test? Per non parlare dell'essere un microbenchmark scritto in modo improprio
Erik

Inoltre, poiché la ricerca binaria può essere applicata solo a un set ordinato, l'ordinamento e la ricerca sono l'unico modo possibile per utilizzare la ricerca binaria.
Erik,

L'ordinamento potrebbe essere già stato fatto per una serie di altri motivi, ad esempio, potrebbe essere ordinato su init e mai modificato. È utile nel testare i tempi di ricerca da solo. Dove questo cade però è essere un esempio meno che stellare di microbenchmarking. I microbenchmark sono notoriamente difficili da ottenere direttamente in Java e dovrebbero ad esempio includere l'esecuzione del codice di test abbastanza per ottenere l'ottimizzazione dell'hotspot prima di eseguire il test effettivo, per non parlare dell'esecuzione del codice di test effettivo più di UNA VOLTA con un timer. Esempio di insidie
Thor84no,

7
Questo test è difettoso poiché esegue tutti e 3 i test nella stessa istanza JVM. I test successivi potrebbero trarre vantaggio dai precedenti per il riscaldamento della cache, JIT, ecc.
Steve Kuo,

4
Questo test è in realtà totalmente indipendente. Sort & Search è una complessità linearitmica (n * log (n)), la ricerca binaria è logaritmica e ArrayUtils.contains è ovviamente lineare. Non è utile confrontare queste soluzioni in quanto sono in classi di complessità totalmente diverse.
dragn,

37

Invece di utilizzare anche la sintassi di inizializzazione rapida dell'array, è possibile inizializzarla immediatamente come Elenco in modo simile utilizzando il metodo Arrays.asList, ad esempio:

public static final List<String> STRINGS = Arrays.asList("firstString", "secondString" ...., "lastString");

Quindi puoi fare (come sopra):

STRINGS.contains("the string you want to find");

36

Con Java 8 è possibile creare uno stream e verificare se le voci nello stream corrispondono "s":

String[] values = {"AB","BC","CD","AE"};
boolean sInArray = Arrays.stream(values).anyMatch("s"::equals);

O come metodo generico:

public static <T> boolean arrayContains(T[] array, T value) {
    return Arrays.stream(array).anyMatch(value::equals);
}

3
Vale la pena notare anche le specializzazioni primitive.
Skiwi,

Inoltre, anyMatchJavaDoc lo afferma "...May not evaluate the predicate on all elements if not necessary for determining the result.", quindi potrebbe non essere necessario continuare l'elaborazione dopo aver trovato una corrispondenza.
mkobit,

28

È possibile utilizzare la classe Arrays per eseguire una ricerca binaria per il valore. Se il tuo array non è ordinato, dovrai utilizzare le funzioni di ordinamento nella stessa classe per ordinare l'array, quindi cercare attraverso di esso.


È possibile utilizzare le funzioni di ordinamento nella stessa classe per ottenere questo ... Dovrei aggiungerlo alla mia risposta.
Thomas Owens,

1
Probabilmente costerà di più dell'approccio asList (). Contiene (), quindi, penso. A meno che non sia necessario farlo molto spesso (ma se è solo un elenco statico di valori che possono essere ordinati per cominciare, per essere onesti).
Joey,

Vero. Ci sono molte variabili su quale sarebbe la più efficace. È bello avere delle opzioni però.
Thomas Owens,

Un codice che fa questo qui: stackoverflow.com/a/48242328/9131078
OOBalance

L'ordinamento di un intero array ai fini di una ricerca è costoso. Possiamo usare lo stesso tempo di CPU per la ricerca del liner stesso. Preferisco la ricerca binaria su una raccolta che è già stata precedentemente creata in ordine ordinato.
arunwithasmile,

17

ObStupidAnswer (ma penso che ci sia una lezione qui da qualche parte):

enum Values {
    AB, BC, CD, AE
}

try {
    Values.valueOf(s);
    return true;
} catch (IllegalArgumentException exc) {
    return false;
}

1
Il lancio di eccezioni è apparentemente pesante ma questo sarebbe un nuovo modo di testare un valore se funzionasse. L'aspetto negativo è che l'enum deve essere definito in anticipo.
James P.

13

In realtà, se usi HashSet <String> come proposto da Tom Hawtin, non devi preoccuparti dell'ordinamento e la tua velocità è la stessa della ricerca binaria su un array preordinato, probabilmente anche più veloce.

Dipende tutto da come è impostato il tuo codice, ovviamente, ma da dove mi trovo, l'ordine sarebbe:

Su un array non ordinato:

  1. HashSet
  2. asList
  3. ordinamento e binario

Su un array ordinato:

  1. HashSet
  2. Binario
  3. asList

Quindi, in entrambi i casi, HashSet per la vittoria.


2
L'appartenenza a HashSet deve essere O (1) e la ricerca binaria in una raccolta ordinata è O (log n).
Skylar Saveland,

11

Se disponi della libreria di raccolte di Google, la risposta di Tom può essere semplificata molto utilizzando ImmutableSet (http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/ImmutableSet.html)

Questo rimuove davvero molto disordine dall'inizializzazione proposta

private static final Set<String> VALUES =  ImmutableSet.of("AB","BC","CD","AE");

10

Una possibile soluzione:

import java.util.Arrays;
import java.util.List;

public class ArrayContainsElement {
  public static final List<String> VALUES = Arrays.asList("AB", "BC", "CD", "AE");

  public static void main(String args[]) {

      if (VALUES.contains("AB")) {
          System.out.println("Contains");
      } else {
          System.out.println("Not contains");
      }
  }
}

8

Gli sviluppatori fanno spesso:

Set<String> set = new HashSet<String>(Arrays.asList(arr));
return set.contains(targetValue);

Il codice sopra funziona, ma non è necessario convertire un elenco da impostare per primo. La conversione di un elenco in un set richiede tempo aggiuntivo. Può essere semplice come:

Arrays.asList(arr).contains(targetValue);

o

   for(String s: arr){
        if(s.equals(targetValue))
            return true;
    }

return false;

Il primo è più leggibile del secondo.


7

L'uso di un semplice ciclo è il modo più efficiente per farlo.

boolean useLoop(String[] arr, String targetValue) {
    for(String s: arr){
        if(s.equals(targetValue))
            return true;
    }
    return false;
}

Per gentile concessione di Programcreek


Ciò genererà un'eccezione puntatore null se l'array contiene un riferimento null prima del valore target.
Samuel Edwin Ward il

1
l'istruzione if dovrebbe essere: if (targetValue.equals (s)) perché String uguale ha un controllo di istanza.
Archon

usa Objects.equals (obj1, obj2) invece di essere null sicuro.
trilogia,

7

In Java 8 usa Stream.

List<String> myList =
Arrays.asList("a1", "a2", "b1", "c2", "c1");

myList
.stream()
.filter(s -> s.startsWith("c"))
.map(String::toUpperCase)
.sorted()
.forEach(System.out::println);

7
Ci sono dei vantaggi con questo approccio?
Johannes Stadler,

1
Non risponde alla domanda.
Florian F,

5
  1. Per matrici di lunghezza limitata, utilizzare quanto segue (come indicato da Camickr ). Questo è lento per controlli ripetuti, specialmente per array più lunghi (ricerca lineare).

     Arrays.asList(...).contains(...)
  2. Per prestazioni veloci se si verifica ripetutamente un insieme più ampio di elementi

    • Un array è la struttura sbagliata. Usa a TreeSete aggiungi ogni elemento ad esso. Ordina gli elementi e ha un exist()metodo rapido (ricerca binaria).

    • Se gli elementi implementano Comparablee si desidera l' TreeSetordinamento di conseguenza:

      ElementClass.compareTo()il metodo deve essere compatibile con ElementClass.equals(): vedi Triadi che non si presentano per combattere? (Java Set manca un elemento)

      TreeSet myElements = new TreeSet();
      
      // Do this for each element (implementing *Comparable*)
      myElements.add(nextElement);
      
      // *Alternatively*, if an array is forceably provided from other code:
      myElements.addAll(Arrays.asList(myArray));
    • Altrimenti, usa il tuo Comparator:

      class MyComparator implements Comparator<ElementClass> {
           int compareTo(ElementClass element1; ElementClass element2) {
                // Your comparison of elements
                // Should be consistent with object equality
           }
      
           boolean equals(Object otherComparator) {
                // Your equality of comparators
           }
      }
      
      
      // construct TreeSet with the comparator
      TreeSet myElements = new TreeSet(new MyComparator());
      
      // Do this for each element (implementing *Comparable*)
      myElements.add(nextElement);
    • Il payoff: controlla l'esistenza di alcuni elementi:

      // Fast binary search through sorted elements (performance ~ log(size)):
      boolean containsElement = myElements.exists(someElement);

4
Perché preoccuparsi di TreeSet? HashSetè più veloce (O (1)) e non richiede l'ordinamento.
Sean Owen,

4

Prova questo:

ArrayList<Integer> arrlist = new ArrayList<Integer>(8);

// use add() method to add elements in the list
arrlist.add(20);
arrlist.add(25);
arrlist.add(10);
arrlist.add(15);

boolean retval = arrlist.contains(10);
if (retval == true) {
    System.out.println("10 is contained in the list");
}
else {
    System.out.println("10 is not contained in the list");
}

4

Utilizzare quanto segue (il contains()metodo èArrayUtils.in() in questo codice):

ObjectUtils.java

public class ObjectUtils{

    /**
     * A null safe method to detect if two objects are equal.
     * @param object1
     * @param object2
     * @return true if either both objects are null, or equal, else returns false.
     */
    public static boolean equals(Object object1, Object object2){
        return object1==null ? object2==null : object1.equals(object2);
    }

}

ArrayUtils.java

public class ArrayUtils{

    /**
     * Find the index of of an object is in given array, starting from given inclusive index.
     * @param ts  Array to be searched in.
     * @param t  Object to be searched.
     * @param start  The index from where the search must start.
     * @return Index of the given object in the array if it is there, else -1.
     */
    public static <T> int indexOf(final T[] ts, final T t, int start){
        for(int i = start; i < ts.length; ++i)
            if(ObjectUtils.equals(ts[i], t))
                return i;
        return -1;
    }

    /**
     * Find the index of of an object is in given array, starting from 0;
     * @param ts  Array to be searched in.
     * @param t  Object to be searched.
     * @return  indexOf(ts, t, 0)
     */
    public static <T> int indexOf(final T[] ts, final T t){
        return indexOf(ts, t, 0);
    }

    /**
     * Detect if the given object is in the given array.
     * @param ts  Array to be searched in.
     * @param t  Object to be searched.
     * @return  If indexOf(ts, t) is greater than -1.
     */
    public static <T> boolean in(final T[] ts, final T t){
        return indexOf(ts, t) > -1 ;
    }

}

Come puoi vedere nel codice sopra, ci sono altri metodi di utilità ObjectUtils.equals()e ArrayUtils.indexOf()che sono stati usati anche in altri luoghi.


Sono in ritardo per unirmi a questa discussione, ma dato che il mio approccio nel risolvere questo problema, quando l'ho affrontato qualche anno fa, era un po 'diverso dalle altre risposte già pubblicate qui, sto pubblicando quella soluzione che ho usato in quel momento, qui, nel caso qualcuno lo trovi utile.
Abhishek Oza,

3

Verificare questo

String[] VALUES = new String[] {"AB","BC","CD","AE"};
String s;

for(int i=0; i< VALUES.length ; i++)
{
    if ( VALUES[i].equals(s) )
    { 
        // do your stuff
    } 
    else{    
        //do your stuff
    }
}

1
Questo non funziona: inserirà il valore elseper ogni elemento che non corrisponde (quindi se stai cercando "AB" in quell'array, ci andrà 3 volte, poiché 3 dei valori non sono "AB ").
Bernhard Barker il

3

Arrays.asList () -> quindi chiamare il metodo Includes () funzionerà sempre, ma un algoritmo di ricerca è molto meglio poiché non è necessario creare un wrapper di elenco leggero attorno all'array, che è ciò che fa Arrays.asList () .

public boolean findString(String[] strings, String desired){
   for (String str : strings){
       if (desired.equals(str)) {
           return true;
       }
   }
   return false; //if we get here… there is no desired String, return false.
}

Arrays.asListnon è O (n). È solo un involucro leggero. Dai un'occhiata all'implementazione.
Patrick Parker,

3

Se non vuoi che faccia distinzione tra maiuscole e minuscole

Arrays.stream(VALUES).anyMatch(s::equalsIgnoreCase);

2

Utilizzare Array.BinarySearch(array,obj)per trovare l'oggetto dato in array o no.

Esempio:

if (Array.BinarySearch(str, i) > -1)`  true --exists

false - non esiste


4
Array.BinarySearche Array.FindIndexsono metodi .NET e non esistono in Java.
ataylor,

@ataylor c'è Arrays.binaryCerca in java. Ma hai ragione, no Arrays.findIndex
mente,

Va notato:The array must be sorted prior to making this call. If it is not sorted, the results are undefined.
Dorian Gray il

1

Crea un valore booleano inizialmente impostato su false. Esegui un ciclo per verificare ogni valore nell'array e confrontalo con il valore che stai verificando. Se mai ottieni una corrispondenza, imposta booleano su true e interrompi il looping. Quindi asserire che il booleano è vero.


1

Prova a utilizzare il metodo di test del predicato Java 8

Ecco un esempio completo di esso.

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
public class Test {
 public static final List<String> VALUES = Arrays.asList("AA", "AB", "BC", "CD", "AE");

 public static void main(String args[]) {
  Predicate<String> containsLetterA = VALUES -> VALUES.contains("AB");
  for (String i : VALUES) {

   System.out.println(containsLetterA.test(i));
  } 
 }
}

http://mytechnologythought.blogspot.com/2019/10/java-8-predicate-test-method-example.html

https://github.com/VipulGulhane1/java8/blob/master/Test.java


0

l'uso di a Spliterator impedisce la generazione non necessaria di a List

boolean found = false;  // class variable

String search = "AB";
Spliterator<String> spl = Arrays.spliterator( VALUES, 0, VALUES.length );
while( (! found) && spl.tryAdvance(o -> found = o.equals( search )) );

found == truese searchè contenuto nell'array


questo fa lavoro per array di primitive

public static final int[] VALUES = new int[] {1, 2, 3, 4};
boolean found = false;  // class variable

int search = 2;
Spliterator<Integer> spl = Arrays.spliterator( VALUES, 0, VALUES.length );


-2

Puoi verificarlo con due metodi

A) Convertendo l'array in stringa e quindi controllare la stringa richiesta con il metodo .contains

 String a=Arrays.toString(VALUES);
    System.out.println(a.contains("AB"));
    System.out.println(a.contains("BC"));
    System.out.println(a.contains("CD"));
    System.out.println(a.contains("AE"));

B) questo è un metodo più efficace

 Scanner s=new Scanner(System.in);


   String u=s.next();
   boolean d=true;
    for(int i=0;i<VAL.length;i++)
    {
        if(VAL[i].equals(u)==d)
            System.out.println(VAL[i] +" "+u+VAL[i].equals(u));  

    }

1
La conversione della stringa è assurdamente inefficiente e la soluzione non è corretta, ad es. Contiene (",") restituirà true.
Atuos,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.