2013-07-07 16 views
6

Un codice Java semplice per verificare se un elemento è presente in un array o no:Verifica se un elemento esiste in una matrice

import java.util.Arrays; 

public class Main { 
    static int[] numbers = {813, 907, 908, 909, 910}; 

    public static void main(String[] args) { 
     int number = 907; 
     //Integer number = 907; // the same thing -- it's not found. 
     boolean b = Arrays.asList(numbers).contains(number); 
     System.out.println(b); // => false 
    } 
} 

1) Perché non si trovano 907 nella matrice?

2) Se c'è un modo migliore per farlo, vai avanti e condividi le tue conoscenze.

UPDATE:

Si diceva che asList converte il int[] in un List<int[]> con un unico socio: l'elenco originale. Tuttavia, mi aspetto che il seguente codice di darmi 1, ma mi dà 5:

System.out.println(Arrays.asList(numbers).size()); 
+0

Hai provato a utilizzare numero intero = 907; ? –

+0

La strega è la tua domanda? – surfealokesea

+0

non "int" significa intero? –

risposta

12

Il problema è che Arrays.asList(numbers) non sta facendo quello che tu pensi. Si sta convertendo il tuo int[] in un List<int[]> con un singolo membro: l'elenco originale.

È possibile eseguire una ricerca lineare semplice o, se l'array numbers è sempre ordinato, utilizzare Arrays.binarySearch(numbers, 907); e verificare se il risultato è negativo (ovvero non trovato).

+1

** Si sta convertendo il tuo int [] in un elenco con un singolo membro: l'elenco originale. ** --sorry, non ho capito. –

+0

'.asList (num)' significa "come lista". Non dovresti aspettarti un metodo chiamato '.asList (num)' per restituire invece un array ... –

+0

guarda il mio aggiornamento –

6

liste non contengono primitive, così Arrays.asList (int []) produrrà un List con un ingresso di tipo int[].

Questo codice funziona:

static Integer[] numbers = {813, 907, 908, 909, 910}; 

public static void main(String[] args) { 
    Integer number = 907; 
    boolean b = Arrays.asList(numbers).contains(number); 
    System.out.println(b); // => false 
} 

per la tua domanda come quello che sarà Arrays.asList(numbers) contenere fintanto che si tratta di un int[]:

Questo codice:

static int[] numbers = {813, 907, 908, 909, 910}; 

public static void main(String[] args) { 
    int number = 907; 
    List<int[]> list = Arrays.asList(numbers); 

    boolean b = list.contains(number); 
    System.out.println(b); // => false 
    System.out.println("list: " + list); 
    for(int[] next : list) { 
     System.out.println("content: " + Arrays.toString(next)); 
    } 
} 

ha questo risultato:

false 
list: [[[email protected]] 
content: [813, 907, 908, 909, 910] 

Come si può vedere, lo list contiene un elemento di tipo int[] (il [[I indica lo int[]). Ha gli elementi che sono stati inizialmente creati.

+0

** con una voce di tipo int [] ** - quale sarà il valore di questa voce? –

+0

@MariusKavansky L'array originale. Aggiornerò la mia risposta per spiegare. –

+0

@MariusKavansky Dai un'occhiata al mio aggiornamento –

1

Poiché l'array è ordinato, è possibile utilizzare Arrays.binarySearch().

Ciò consente di non dover convertire prima in un List. Controlla il codice di ritorno di questo metodo: se è positivo, l'elemento è nell'array; se è negativo, non è:

int number = 907; 
System.out.println(Arrays.binarySearch(numbers, number) >= 0); 
+0

guarda il mio aggiornamento –

+0

Uhm, OK, ho bisogno di testare; tuttavia, se questo è un array ordinato, il mio metodo funzionerà per te. Eliminazione della parte irrilevante. – fge

2

Con guava ImmutableSet:

public class Main { 

    private static final Set<Integer> NUMBERS = ImmutableSet.of(813, 907, 908, 909, 910); 

    public static void main(final String[] args) { 
     final int number = 907; 
     final boolean b = NUMBERS.contains(number); 
     System.out.println(b); // true 
    } 
} 

ImmutableSet assicura nessuno aggiunge qualcosa alla NUMBERS

0

Utilizzare questo codice.Questa è solo una di quelle volte che hai avuto modo di trattare con stranezze fortemente tipizzati di Java :)

import java.util.Arrays; 

    public class Main { 
     static Integer[] numbers = {813, 907, 908, 909, 910}; 

     public static void main(String[] args) { 
     Integer number = new Integer(907); 

     boolean b = Arrays.asList(numbers).contains(number); 
     System.out.println(b); 
    } 
} 
+0

Hai notato che la tua risposta è esattamente uguale alla mia? –

+0

Non proprio, oggetto contro simbolo ... È anche un po 'più corto – PMARINA

0

Si potrebbe utilizzare un ciclo passando attraverso l'array e abbinare ogni elemento con quello che si sta cercando . Successivamente puoi andare da lì.

Per il motivo per cui non funziona è lo stesso motivo che altri hanno detto prima.

Problemi correlati