Cosa fa l'operatore due punti (:)?


91

Apparentemente i due punti vengono utilizzati in più modi in Java. A qualcuno dispiacerebbe spiegare cosa fa?

Ad esempio qui:

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

Come scriveresti questo for-eachciclo in un modo diverso in modo da non incorporare il :?


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

Risposte:


195

Ci sono diversi punti in cui i due punti vengono utilizzati nel codice Java:

1) Etichetta Jump-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 ternaria ( Tutorial ):

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

3) Per ogni ciclo ( Tutorial ):

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

4) Asserzione ( Guida ):

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 nell'istruzione switch ( Tutorial ):

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

6) 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
bello - me ne sono perso qualcuno! e non sapevo nemmeno che potessi nominare affermazioni del genere, molto utili.
Claudiu

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

2
Un errore assertnon "chiude il programma". Lancia un AssertionError. Provocherà la chiusura del programma solo se viene lanciato sullo stack dell'unico thread non daemon rimanente ... e non viene catturato.
Stephen C

se intendi includere tutto, aggiungerei due punti doppi (: :) operator
kiedysktos

1
Inoltre, i due punti doppi vengono utilizzati nei riferimenti ai metodi.
Daniel M.

34

Non esiste un operatore "due punti", ma i due punti vengono visualizzati in due posizioni:

1: Nell'operatore ternario, ad esempio:

int x = bigInt ? 10000 : 50;

In questo caso, l'operatore ternario funge da "se" per le espressioni. Se bigInt è vero, allora x riceverà 10000 assegnati. In caso contrario, 50. I due punti qui significano "altro".

2: In un ciclo for-each:

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

Questo imposta a turno x a ciascuno dei valori in "vals". Quindi se vals contiene [10, 20.3, 30, ...], allora x sarà 10 alla prima iterazione, 20.3 alla seconda, ecc.

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


il secondo tempo ha aiutato, questa dovrebbe essere la vera risposta
erp

+1 per la spiegazione più dettagliata di ciò che sta facendo in for-each loop.
dfarrell07

18

Giusto per aggiungere, se usato in un ciclo for-each, ":" può essere letto fondamentalmente come "in".

Così

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

dovrebbe essere letto "Per ogni nome IN nomi fare ..."


15

Come scriveresti questo ciclo for-each in modo diverso in modo da non incorporare il ":"?

Supponendo che listsia Collectionun'istanza ...

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

Aggiungo il punto pedante che :non è un operatore in questo contesto. Un operatore esegue un'operazione in un'espressione e le cose all'interno ( ... )di forun'istruzione non sono un'espressione ... secondo JLS.


La mia domanda è: perché? Perché fare la stessa cosa nel lungo periodo?
RichN

2
@RichN - non vuole farlo, vuole solo sapere come.
Stephen C

3
non compiti a casa, voglio sapere come farlo a lungo in modo da poter capire la logica
limone

In realtà nella mia (cattiva) università, durante gli studi di ingegneria informatica, non ci hanno mai insegnato nulla sul (:) nel corso java, sono arrivato a impararlo più tardi guardando esempi e sfortunatamente, ora è difficile per me codificarlo nella mia mente da quando ho fatto tutti i progetti
Carlos Sanchez

Non è necessario presumere che listsia un'istanza di Collection; deve essere un'istanza di Iterablese può essere utilizzato nel ciclo for migliorato, il che significa che avrà il iterator()metodo che chiami su di esso nella tua risposta.
Kröw

1

Viene utilizzato nei cicli for per iterare su un elenco di oggetti.

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

Pensalo come un for <item> in <list>in Python.


1

Nel tuo caso specifico,

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

this.listè una raccolta (elenco, insieme o matrice) e tale codice viene assegnato ca ciascun elemento della raccolta.

Quindi, se this.listfosse una raccolta {"2S", "3H", "4S"} cardString, alla fine sarebbe questa stringa:

2S
3H
4S

1
grazie per la tua risposta. Come potrebbe essere riscritto questo codice per non utilizzare ":"?
limone

1

Di solito lo vedi nell'operatore di assegnazione ternaria;

Sintassi

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

esempio:

boolean isNegative = number > 0 ? false : true;

che è "equivalente" in natura a if else

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

Oltre agli esempi forniti da diversi poster,

puoi anche usare: per indicare un'etichetta per un blocco che puoi usare insieme a continua e interrompi ..

per 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 booleano isNegative = number> 0; Le condizioni ternarie sono buone per cose come double sgn = numero> 0? 1: 0;
user44242

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

1
@ user44242 Mostrare un esempio del genere lo rende semplice e mostra meglio come funziona l'operatore condizionale. " Perché non dovresti scrivere booleano isNegative = number> 0; " Perché questo non dimostra nulla sull'operatore ternario.
Kröw

1

Stampa la stringa "qualcosa" 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
P.JAYASRI

1

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

Ecco un esempio del conciso per ogni ciclo:

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

Nell'esempio sopra, i due punti (:) possono essere letti come "in". Il ciclo per ogni ciclo può essere letto come "per ogni elemento Integer (chiamato grado) in quizGrades, stampa il valore del voto."


0

È usato nella nuova mano corta per / loop

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

e l'operatore ternario

list.isEmpty() ? true : false;

Non mi rendevo conto che fosse così nuovo ... quando è arrivato?
Ritwik Bose


3
oh ... questo è stato 6 anni fa ... Non nuovo per il mio quadro di riferimento: D
Ritwik Bose

2
Sto con i maialini: sei anni significa che esiste praticamente dall'alba dei tempi.
James Moore,

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 nel per ogni ciclo:

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

letteralmente:

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

0

i due punti utilizzano in for-each loop, 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);
                   }
       }
}
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.