2013-04-26 12 views
5

Ho provato a cercare per questo, ma io in realtà non ora come formulare correttamente alla domanda ...Ho bisogno di assistenza per l'istruzione if con molti operatori logici più semplici

Ho un if-statement con molte logica operatori. Come faccio a farlo più facile?

If (n == 1 ||n == 2 ||n == 3 ||n == 5 ||n == 9 ||n == 8 ||n == 7 ||n == 551 ||n == 17 ||n == 81 || etc etc) 
{ //Stuff 
} 

Sto pensando in pseudo-codice Voglio qualcosa di simile:

List list = {1, 3, 5, 7, 9, 12, 14, 16, 18, 19, 21, 23, 25, 27, 30, 32, 34, or 36 } 

if n is in list, then {} 

Come avrete capito, io sono un principiante e ho problemi di formulazione di quello che mi serve.

+1

Sì, il tuo approccio lista funzionerà, è la strada da percorrere .. – Thihara

+0

@smerny Non c'è bisogno di un interruttore se si tratta di una singola istruzione if ... – Thihara

risposta

13

ne dite:

int[] validOptions = { 1, 2, 3, 5, 7, 8, 9, 17, 81, 551 }; 

if (Arrays.binarySearch(validOptions, n) >= 0) 
{ 
    // Yup, found it 
} 

Nota che ho riordinato il vostro assegno originale (che aveva 551 entro il 17, per esempio) in modo che l'array è ordinato. Una ricerca binaria solo funziona con dati ordinati.

Sto solo suggerendo un array qui sulla base del fatto che è leggermente più facile da specificare, in particolare quando si tratta di un tipo primitivo. Se vuoi che siano dinamici, un List<Integer> o un sarebbe più appropriato.

Nota che mentre quasi certamente non ha importanza, mentre il set è piccolo, vale la pena considerare le caratteristiche prestazionali di diverse ricerche:

  • HashSet.contains - O (1)
  • Arrays.binarySearch - O (log N)
  • ArrayList.contains - O (N)
+0

Andiamo, tutti hanno appena dato suggerimenti nei commenti, consegnate il codice! ?! È malvagio! : D – TheBlastOne

+1

La ricerca binaria funzionerà solo per la matrice ordinata. –

+0

@AleksG, i suoi array e quelli dell'OP sembrano essere ordinati. sarà più veloce in questo modo. – smerny

3

Sì, buttare tutto in un ArrayList e quindi utilizzare il 01.238.951 Metodo:

List<Integer> numbers = new ArrayList<Integer>(); 
number.add(...; 

if(numbers.contains(n)) 
{ 
    ... 
} 
1

L'approccio della Lista è corretto. Si può fare qualcosa di simile:

int[] values = {1, 3, 5, 7, 9, 12, 14, 16, 18, 19, 21, 23, 25, 27, 30, 32, 34, 36 }; 
List<Integer> list = new ArrayList<Integer>(); 
if(values.asList(list).contains(n)) { 
    ... 
} 
1
function arrayinside(n, listofn) { 
    var length = listofn.length; 
    for(var i = 0; i < length; i++) { 
     if(listofn[i] == n) return true; 
    } 
    return false; 
} 

Prova questa

+0

Sembra JavaScript e, sebbene risolva il problema, non è una risposta pertinente poiché l'OP chiede consigli su Java. – maba

2

Prova questa:

static private Set<Integer> set = new HashSet<Integer>(
    Arrays.asList(1, 3, 5, 7, 9, 12, 14, 16, 18, 19, 21, 23, 25, 27, 30, 32, 34, 36)); 

poi a prova:

if (set.contains(n)) 

Utilizzando un HashSet renderà eseguire abbastanza bene.

+0

Se la raccolta viene riutilizzata, il wrapping HashSet funzionerà sicuramente meglio. Tuttavia, se la lista viene ricercata una sola volta, questo è un po 'più lento. Il vantaggio dell'hashing è rendere la ricerca più veloce, ma la costruzione della tabella hash richiede la scansione sequenziale dell'array. Se la cerchi solo una volta, allora puoi anche fare una ricerca lineare. – Brandon

Problemi correlati