2010-03-08 17 views
70

Vorrei controllare da solo, ma non so nemmeno come si chiama. Qualcuno avrebbe in mente di spiegare cosa fa?Java: cosa fa l'operatore due punti (:)?

Non sapevo che c'erano più volte il: è apparso. Cosa fare in questo caso qui:

public String toString() { 
    String cardString = ""; 
    for (PlayingCard c : this.list) // <-- 
    { 
     cardString = cardString + c + "\n"; 
    } 

Come si scrive questo for-each ciclo un modo diverso, in modo da non incorporare il ":"?

+4

Altri hanno già detto che tale caso è un ciclo for-each. Per una spiegazione più dettagliata di come funziona, vedere http://java.sun.com/j2se/1.5.0/docs/guide/language/foreach.html – Jonik

risposta

160

Ci sono molti posti del colon viene utilizzato in codice Java:

1) etichetta di salto-out (Tutorial):

label: for (int i = 0; i < x; i++) { 
    for (int j = 0; j < i; j++) { 
     if (something(i, j)) break label; // jumps out of the i loop 
    } 
} 
// i.e. jumps to here 

2) condizione ternario (Tutorial):

int a = (b < 4)? 7: 8; // if b < 4, set a to 7, else set a to 8 

3) Per ciascun-loop (Tutorial):

String[] ss = {"hi", "there"} 
for (String s: ss) { 
    print(s); // output "hi" , and "there" on the next iteration 
} 

4) asserzione (Guide):

int a = factorial(b); 
assert a >= 0: "factorial may not be less than 0"; // throws an AssertionError with the message if the condition evaluates to false 

5) Caso in istruzione switch (Tutorial):

switch (type) { 
    case WHITESPACE: 
    case RETURN: 
     break; 
    case NUMBER: 
     print("got number: " + value); 
     break; 
    default: 
     print("syntax error"); 
} 

6) I riferimenti ai metodi (Tutorial)

class Person { 
    public static int compareByAge(Person a, Person b) { 
     return a.birthday.compareTo(b.birthday); 
    }} 
} 

Arrays.sort(persons, Person::compareByAge); 
+3

nice - Ho perso un po '! e non sapevo nemmeno che potessi nominare asserzioni del genere, molto utili. – Claudiu

+0

Proveniente da .NET (C#), l'analogia più vicina per la struttura in questione sarebbe il for-each, che hai spiegato in modo corretto. – Roger

+1

Un "assert' non riuscito non" chiude il programma ". Genera un 'AssertionError'. Farà uscire il programma solo se viene gettato nello stack del solo thread non demone rimanente ... e non catturato. –

0

E 'utilizzato nella nuova mano abbreviazione di/ciclo

final List<String> list = new ArrayList<String>(); 
for (final String s : list) 
{ 
    System.out.println(s); 
} 

e l'operatore ternario

list.isEmpty() ? true : false; 
+0

Non mi rendevo conto che era quel nuovo ... quando è arrivato? –

+0

@Mechko, in Java 5: http://java.sun.com/j2se/1.5.0/docs/relnotes/features.html#forloop – Jonik

+3

oh ... quello era 6 anni fa ... Non è nuovo dal mio struttura di riferimento: D –

33

Non c'è nessun operatore "due punti", ma i due punti appare in due posti:

1: Nella operatore ternario, ad esempio:

int x = bigInt ? 10000 : 50; 

In questo caso, l'operatore ternario funge da "se" per le espressioni. Se bigInt è true, x verrà assegnato a 10000. Altrimenti, 50. Il colon qui significa "altro".

2: In una per ogni ciclo-:

double[] vals = new double[100]; 
//fill x with values 
for (double x : vals) { 
    //do something with x 
} 

Questo imposta x per ciascuno dei valori di 'vals' a loro volta. Quindi se vals contiene [10, 20.3, 30, ...], allora x sarà 10 sulla prima iterazione, 20.3 sulla seconda, ecc.

Nota: Io dico che non è un operatore perché è solo sintassi. Non può apparire da sola in una determinata espressione, ed è solo un caso che sia l'operatore for-each sia l'operatore ternario utilizzino i due punti.

+0

aiutato nel secondo semestre, questa dovrebbe essere la vera risposta – erp

+0

+1 per la spiegazione più dettagliata di ciò che sta facendo in ogni ciclo. – dfarrell07

1

È utilizzato in cicli for per scorrere un elenco di oggetti.

for (Object o: list) 
{ 
    // o is an element of list here 
} 

Si consideri come for <item> in <list> in Python.

0

Il colon esiste effettivamente in combinazione con ?

int minVal = (a < b) ? a : b; 

è equivalente a:

int minval; 
if(a < b){ minval = a;} 
else{ minval = b; } 

anche nella per ogni ciclo:

for(Node n : List l){ ... } 

letteralmente:

for(Node n = l.head; n.next != null; n = n.next) 
1

È di solito lo si vede nell'operatore di assegnazione ternaria;

Sintassi

variable = `condition ? result 1 : result 2;` 

esempio:

boolean isNegative = number > 0 ? false : true; 

che è "equivalente" in natura alla if else

if(number > 0){ 
    isNegative = false; 
} 
else{ 
    isNegative = true; 
} 

Oltre esempi forniti diversi manifesti,

si ca n utilizzare anche: a significare un'etichetta per un blocco che può essere utilizzato in combinazione con continuare e rompere ..

ad esempio:

public void someFunction(){ 
    //an infinite loop 
    goBackHere: { //label 
      for(int i = 0; i < 10 ;i++){ 
       if(i == 9) continue goBackHere; 
      } 
    } 
} 
+2

Mi dispiace, ma questo è un pessimo esempio. Perché non dovresti scrivere boolean isNegative = number> 0; Le condizioni ternarie sono buone per cose come doppio sgn = numero> 0? 1: 0; – user44242

+0

@ user44242 lol sì, non ricordo nemmeno perché ho dato quell'esempio. – ultrajohn

1

Nel vostro caso specifico,

String cardString = ""; 
for (PlayingCard c : this.list) // <-- 
{ 
    cardString = cardString + c + "\n"; 
} 

this.list è una raccolta (elenco, set o array) e il codice assegna c a ciascun elemento della raccolta.

Quindi, se this.list erano una collezione { "2S", "3H", "4S"} poi la cardString alla fine sarebbe questa stringa:

2S 
3H 
4S 
+1

grazie per la tua risposta. Come potrebbe essere riscritto questo codice per non usare ":"? – dukevin

14

Come si scrive questo per -ogni ciclo un modo diverso per non incorporare il ":"?

Supponendo che list è un'istanza Collection ...

public String toString() { 
    String cardString = ""; 
    for (Iterator<PlayingCard> it = this.list.iterator(); it.hasNext(); /**/) { 
     PlayingCard c = it.next(); 
     cardString = cardString + c + "\n"; 
    } 
} 

devo aggiungere il punto saccente che : non è un operatore in questo contesto. Un operatore esegue un'operazione in un'espressione e le cose all'interno di (...) in un'istruzione for non sono un'espressione ... in base al JLS.

+0

La mia domanda è: perché? Perché fare la stessa cosa alla lunga? – RichN

+2

@ RonN: non vuole farlo, vuole solo sapere come. –

+3

non fare i compiti, voglio sapere come fare il lungo cammino in modo da poter capire la logica – dukevin

16

Solo per aggiungere, quando utilizzato in un ciclo for-each, il ":" può essere letto come "in".

Così

for (String name : names) { 
    // remainder omitted 
} 

va letto "Per ogni nome nei nomi do ..."

1

Sarà stampa la stringa "qualcosa" per tre volte.

JLabel[] labels = {new JLabel(), new JLabel(), new JLabel()};     

for (JLabel label : labels)     
{    
    label.setText("something"); 

panel.add(label);    
} 
+1

questo è quanto detto sopra come ciclo ForEach –

0

colon sta usando in per-ogni ciclo, Prova questo esempio,

import java.util.*; 

class ForEachLoop 
{ 
     public static void main(String args[]) 
     {`enter code here` 
     Integer[] iray={1,2,3,4,5}; 
     String[] sray={"ENRIQUE IGLESIAS"}; 
     printME(iray); 
     printME(sray); 

     } 
     public static void printME(Integer[] i) 
     {   
        for(Integer x:i) 
        { 
        System.out.println(x); 
        } 
     } 
     public static void printME(String[] i) 
     { 
        for(String x:i) 
        { 
        System.out.println(x); 
        } 
     } 
} 
1

Poiché la maggior parte per i cicli sono molto simili, Java fornisce una scorciatoia per ridurre la quantità di codice necessaria per scrivere il ciclo chiamato per ogni ciclo.

Ecco un esempio di conciso per ogni ciclo:

for (Integer grade : quizGrades){ 
     System.out.println(grade); 
}  

Nell'esempio precedente, il colon (:) può essere letta come "in". Per ogni ciclo, può essere letto come "per ogni elemento intero (chiamato grado) in quizGrades, stampare il valore del grado".