2013-02-04 14 views
7

Ho questo anello quiLoop nei primi 20 elementi di un array in Java

for(int i =0; i < prices.length; i++) 
    { 
     if(prices[i]>largest) 
     { 
      largest = prices[i]; 
     } 

     else if(prices[i]<smallest) 
     { 
      smallest= prices[i]; 
     } 
    } 

cui scorre l'intera matrice e trova il valore minimo e massimo. Diciamo che volevo scorrere solo i primi 20 elementi come faccio? Ho cercato di creare un loop annidato sotto questo ciclo e vedere se lo trovo ma non posso.

+10

Modificare la condizione in 'i

+13

Senza offesa, ma potrebbe essere meglio leggere prima la letteratura sulle basi della lingua? – Andrey

+3

la maggior parte dei libri di testo introduttivi non mostra che è possibile inserire qualsiasi espressione booleana nella clausola loop. Sii gentile e aiuta OP out –

risposta

22

Si può solo aggiungere il requisito alla condizione di controllo del ciclo:

for(int i =0; i < prices.length && i < 20; i++) 

Ciò controllare i primi 20 elementi in cui ther sono più di 20 nella matrice, ma l'intero array se esistono meno di 20 articoli.

+0

Grazie! Il problema che stavo avendo, pensavo a user2033853 ma non ha fatto il loop attraverso quell'array! Grazie per il tuo gentile aiuto! – user1816464

3

Se si desidera eseguire il ciclo solo tra i primi 20 elementi, quindi pronunciarlo nell'intestazione del ciclo for, come questo.

for(int i =0; i < prices.length && i < 20; i++) 
+0

@AndrewCooper L'ho modificato qualche tempo fa, assicurati di ricaricare la domanda prima di downvotare. – Michael

+1

Commento e downvot rimosso –

4

Cambia il tuo ciclo for per qualcosa di simile:

for(int i =0; i < (prices.length < 20 ? prices.length : 20); i++) 
{ 
    if(prices[i]>largest) 
    { 
     largest = prices[i]; 
    } 
    else if(prices[i]<smallest) 
    { 
     smallest= prices[i]; 
    } 
} 
6
for(int i =0; i < 20 && i < prices.length; i++) 

Questo ciclo volontà attraverso 20 volte, cioè primi venti elementi dell'array.

+0

E che dire quando ci sono meno di 20 elementi in "prezzi"? – nkr

+0

@nkr Ho modificato la risposta per controllare anche la lunghezza dell'array. – user2033853

5

Sostituire prices.length con Math.min(20, prices.length), che è la lunghezza della matrice o 20, a seconda del valore più piccole:

for(int i =0; i < Math.min(20, prices.length); i++)

6

5 risposte e tutti hanno un doppio confronto nel ciclo?

Non c'è da stupirsi, i programmi Java eseguiti molto lentamente ...

Il modo corretto per fare una ciclo è:

for(int i = 0, len = Math.min(prices.length, 20); i < len; i++) 

spostare il confronto tra lunghezza e 20 fuori dal giro e valutare il la condizione del ciclo è quindi due volte più veloce. (ignorando cosa potrebbe o non potrebbe fare la JIT)

Inoltre, è necessario inizializzare il più grande/più piccolo con il primo elemento (oppure si ottengono valori non validi, se c'è un solo elemento nell'array a causa dell'altro) , e quindi si può saltare il primo elemento nel ciclo, rendendo ancora "più veloce":

largest = prices[0]; 
smallest = prices[0]; 
for(int i = 1, len = Math.min(prices.length, 20); i < len; i++) 
+1

hai visto la mia risposta prima di postare la tua? ho fatto esattamente quello che hai fatto – amphibient

+0

@foampile: Sì, ma si chiama anche Min nel ciclo, invece prima del ciclo – BeniBela

+1

penso che l'ottimizzatore java si occuperà delle valutazioni ridondanti – amphibient

-1

valore massimo è corretto per ottenere minima è semplice make max = min poi lavorare come poi

if(min>x[i]) 
    min=x[i]; 
+1

Perché rispondere in modo casuale a una domanda di 3 anni fa? –

Problemi correlati