2010-03-08 36 views
70

Lo buscaría yo mismo, pero ni siquiera sé cómo se llama. ¿Alguien le importaría explicar lo que hace?Java: ¿Qué hace el operador de dos puntos (:)?

No sabía que había muchas veces la: apareció. ¿Qué se puede hacer en este caso aquí:

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

¿Cómo escribir este for-each bucle de una manera diferente con el fin de no incorporar el ":"?

+4

Otros ya han mencionado que dicho caso es un bucle for-each. Para una explicación más detallada de cómo funciona, ver http://java.sun.com/j2se/1.5.0/docs/guide/language/foreach.html – Jonik

Respuesta

160

Hay varios lugares de colon se utiliza en código Java:

1) marca de salto de salida (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) condición ternario (Tutorial):

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

3) Para cada bucle (Tutorial):

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

4) aserción (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) El caso en sentencia switch (Tutorial):

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

6) referencias de métodos (Tutorial)

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

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

nice - ¡Extrañé algunos! y ni siquiera sabía que puedes nombrar aserciones como esa, muy útiles. – Claudiu

+0

Viniendo de .NET (C#), la analogía más cercana para la estructura en cuestión sería la de cada uno, que usted explicó de una buena manera. – Roger

+1

Un 'assert' fallido no" sale del programa ". Lanza un 'AssertionError'. Solo causará que el programa salga si se lanza a la pila del único hilo no-demonio restante ... y no se captura. –

0

Se utiliza en la nueva mano corto para/bucle

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

y el operador ternario

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

No me daba cuenta de que era nueva cuando ... ¿entró? –

+0

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

+3

oh ... eso fue hace 6 años ... No es nuevo por mi marco de referencia: D –

33

No hay operador "dos puntos", pero el colon aparece en dos lugares:

1: En el operador ternario, por ejemplo:

int x = bigInt ? 10000 : 50; 

En este caso, el operador ternario actúa como un 'si' para las expresiones. Si bigInt es verdadero, entonces x tendrá 10000 asignados a él. Si no, 50. Los dos puntos aquí significan "else".

2: En un cada uno para-loop:

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

Esta conjuntos X a cada uno de los valores en 'vals' a su vez. Entonces si vals contiene [10, 20.3, 30, ...], entonces x será 10 en la primera iteración, 20.3 en el segundo, etc.

Nota: Digo que no es un operador porque es solo sintaxis. No puede aparecer en una expresión dada por sí mismo, y es solo una casualidad que tanto el operador for-each como el operador ternario usen dos puntos.

+0

ayudó la segunda mitad, esta debería ser la respuesta real – erp

+0

+1 para la explicación más detallada de lo que está haciendo en for-each loop. – dfarrell07

1

Se usa en bucles para iterar sobre una lista de objetos.

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

Piense en ello como for <item> in <list> en Python.

0

El colon realmente existe en conjunción con ?

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

es equivalente a:

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

También en el para cada bucle:

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

literalmente:

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

Usted generalmente lo veo en el operador de asignación ternaria;

Sintaxis

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

ejemplo:

boolean isNegative = number > 0 ? false : true; 

que es "equivalente" en la naturaleza a la si otro

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

Aparte de ejemplos dados por diferentes carteles,

usted ca n también utilizar: para significar una etiqueta para un bloque que se puede utilizar en conjunción con seguir y romper ..

por ejemplo:

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

Lo siento, pero ese es un terrible ejemplo. ¿Por qué no escribirías boolean isNegative = number> 0; Las condiciones ternarias son buenas para cosas como double sgn = number> 0? 1: 0; – user44242

+0

@ user44242 lol sí, ni siquiera recuerdo por qué di ese ejemplo. – ultrajohn

1

En su caso específico,

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

this.list es una colección (lista, conjunto o matriz) y ese código asigna c a cada elemento de la colección.

lo tanto, si this.list eran una colección { "2S", "3H", "4S"} entonces el cardString en el extremo sería la siguiente cadena:

2S 
3H 
4S 
+1

gracias por su respuesta. ¿Cómo podría reescribirse este código para no usar el ":"? – dukevin

14

¿Cómo escribir esto para -cada uno de los bucles de una manera diferente para no incorporar el ":"?

Suponiendo que list es una instancia Collection ...

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

debería añadir el punto pedante que : no es un operador en este contexto. Un operador realiza una operación en una expresión, y las cosas dentro de (...) en una declaración for no son una expresión ... según el JLS.

+0

Mi pregunta es: ¿por qué? ¿Por qué hacer lo mismo a lo largo del camino? – RichN

+2

@RichN - él no quiere hacerlo, solo quiere saber cómo. –

+3

no deberes, quiero saber cómo hacerlo a lo largo para que pueda entender la lógica – dukevin

16

Sólo para añadir, cuando se utiliza en un para-cada bucle, el ":" básicamente se puede leer como "en".

Así

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

debe leerse "Para cada nombre en los nombres de hacer ..."

1

Se imprime la cadena "algo" tres veces.

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

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

panel.add(label);    
} 
+1

esto es lo que dije anteriormente como ForEach loop –

0

de colon está utilizando en fines de cada bucle, Prueba este ejemplo,

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

Dado que la mayoría de los bucles son muy similares, Java proporciona un acceso directo para reducir la cantidad de código necesario para escribir el bucle llamado para cada bucle.

Aquí es un ejemplo de la concisa para cada bucle:

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

En el ejemplo anterior, los dos puntos (:) se puede leer como "en". El para cada bucle por completo se puede leer como "para cada elemento de enteros (llamado grado) en quizGrades, imprimir el valor de grado."