Was macht der Doppelpunkt (:) Operator?


87

Anscheinend wird ein Doppelpunkt in Java auf verschiedene Arten verwendet. Würde es jemandem etwas ausmachen zu erklären, was es tut?

Zum Beispiel hier:

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

Wie würden Sie diese for-eachSchleife anders schreiben, um die nicht zu integrieren :?


4
Andere haben bereits erwähnt, dass ein solcher Fall eine für jede Schleife ist. Eine ausführlichere Erklärung der Funktionsweise finden Sie unter java.sun.com/j2se/1.5.0/docs/guide/language/foreach.html
Jonik

Antworten:


189

Es gibt mehrere Stellen, an denen Doppelpunkte im Java-Code verwendet werden:

1) Jump-Out-Label ( 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) Ternärer Zustand ( Tutorial ):

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

3) Für jede Schleife ( Tutorial ):

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

4) Behauptung ( Leitfaden ):

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) Fall in der switch-Anweisung ( Tutorial ):

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

6) Methodenreferenzen ( Tutorial )

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

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

3
schön - ich habe ein paar verpasst! und ich wusste nicht einmal, dass man solche Behauptungen nennen kann, sehr nützlich.
Claudiu

Aus .NET (C #) stammend, wäre die engste Analogie für die betreffende Struktur die für jeden, die Sie auf gute Weise erklärt haben.
Roger

2
Ein Fehler assert"beendet das Programm nicht". Es wirft eine AssertionError. Das Programm wird nur beendet, wenn es auf den Stapel des einzigen verbleibenden Nicht-Daemon-Threads geworfen wird ... und nicht abgefangen wird.
Stephen C

Wenn Sie alle einschließen möchten, würde ich Doppelpunkt (: :) operator
kiedysktos

1
Außerdem wird in Methodenreferenzen ein Doppelpunkt verwendet.
Daniel M.

34

Es gibt keinen "Doppelpunkt" -Operator, aber der Doppelpunkt wird an zwei Stellen angezeigt:

1: Im ternären Operator, z.

int x = bigInt ? 10000 : 50;

In diesem Fall fungiert der ternäre Operator als "Wenn" für Ausdrücke. Wenn bigInt wahr ist, wird x 10000 zugewiesen. Wenn nicht, 50. Der Doppelpunkt bedeutet hier "sonst".

2: In einer for-each-Schleife:

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

Dies setzt nacheinander x auf jeden der Werte in 'vals'. Wenn also vals [10, 20.3, 30, ...] enthält, ist x bei der ersten Iteration 10, bei der zweiten 20,3 usw.

Hinweis: Ich sage, es ist kein Operator, weil es nur Syntax ist. Es kann nicht in einem bestimmten Ausdruck für sich erscheinen, und es ist nur eine Chance, dass sowohl der for-each- als auch der ternäre Operator einen Doppelpunkt verwenden.


Die zweite Hälfte hat geholfen, dies sollte die eigentliche Antwort sein
erp

+1 für die ausführlichere Erklärung dessen, was in jeder Schleife getan wird.
dfarrell07

18

Nur um hinzuzufügen, kann das ":" bei Verwendung in einer for-each-Schleife grundsätzlich als "in" gelesen werden.

So

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

sollte gelesen werden "Für jeden Namen IN Namen tun ..."


15

Wie würden Sie diese Schleife für jede Schleife anders schreiben, um das ":" nicht zu berücksichtigen?

Angenommen, das listist eine CollectionInstanz ...

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

Ich sollte den pedantischen Punkt hinzufügen, der :in diesem Zusammenhang kein Operator ist. Ein Operator führt eine Operation in einem Ausdruck aus, und das Material ( ... )in einer forAnweisung ist kein Ausdruck ... gemäß JLS.


Meine Frage ist: warum? Warum auf lange Sicht dasselbe tun?
RichN

2
@RichN - er will es nicht tun, er will nur wissen wie.
Stephen C

3
Keine Hausaufgaben, ich möchte wissen, wie es geht, damit ich die Logik verstehen kann
Zitrone

Tatsächlich haben sie uns an meiner (schlechten) Universität während des Informatikstudiums nie etwas über das (:) im Java-Kurs beigebracht. Ich habe es später anhand von Beispielen gelernt, und leider fällt es mir jetzt schwer, es zu codieren in meinem Kopf, seit ich alle Projekte in der Uni auf dem langen Weg gemacht habe
Carlos Sanchez

Sie müssen nicht davon ausgehen, dass dies listeine Instanz von ist Collection. Es muss eine Instanz sein, Iterablewenn es in der erweiterten for-Schleife verwendet werden kann, was bedeutet, dass es die iterator()Methode enthält, die Sie in Ihrer Antwort aufrufen.
Kröw

1

Es wird in for-Schleifen verwendet, um eine Liste von Objekten zu durchlaufen.

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

Betrachten Sie es als for <item> in <list>in Python.


1

In Ihrem speziellen Fall

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

this.listist eine Sammlung (Liste, Menge oder Array), und dieser Code wird cjedem Element der Sammlung zugewiesen.

Wenn also this.listeine Sammlung {"2S", "3H", "4S"} cardStringwäre, wäre das am Ende diese Zeichenfolge:

2S
3H
4S

1
Danke für deine Antwort. Wie könnte dieser Code umgeschrieben werden, um das ":" nicht zu verwenden?
Zitrone

1

Sie sehen es normalerweise im ternären Zuweisungsoperator.

Syntax

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

Beispiel:

boolean isNegative = number > 0 ? false : true;

Das ist "äquivalent" in der Natur zu dem wenn sonst

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

Andere als Beispiele von verschiedenen Postern,

Sie können auch verwenden:, um eine Bezeichnung für einen Block zu kennzeichnen, die Sie in Verbindung mit continue und break verwenden können.

beispielsweise:

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

2
Es tut mir leid, aber das ist ein schreckliches Beispiel. Warum würden Sie nicht boolean isNegative = number> 0 schreiben? Ternäre Bedingungen sind gut für Dinge wie double sgn = number> 0? 1: 0;
user44242

@ user44242 lol ja ich erinnere mich nicht einmal, warum ich dieses Beispiel gegeben habe.
Ultrajohn

1
@ user44242 Das Zeigen eines solchen Beispiels hält es einfach und zeigt besser, wie der bedingte Operator funktioniert. " Warum würden Sie nicht boolean isNegative = number> 0 schreiben? " Weil das nichts über den ternären Operator zeigt.
Kröw

1

Die Zeichenfolge "etwas" wird dreimal gedruckt.

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

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

 panel.add(label);             
 }

1
Dies ist, was oben als ForEach-Schleife gesagt wurde
P.JAYASRI

1

Da die meisten for-Schleifen sehr ähnlich sind, bietet Java eine Verknüpfung, um die Menge an Code zu reduzieren, die zum Schreiben der Schleife erforderlich ist, die für jede Schleife bezeichnet wird.

Hier ist ein Beispiel für die Prägnanz für jede Schleife:

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

Im obigen Beispiel kann der Doppelpunkt (:) als "in" gelesen werden. Die für jede Schleife insgesamt kann gelesen werden als "für jedes Integer-Element (als Note bezeichnet) in quizGrades den Wert der Note ausdrucken".


0

Es wird in der neuen Kurzzeiger für / loop verwendet

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

und der ternäre Operator

list.isEmpty() ? true : false;

Ich wusste nicht, dass es so neu ist ... wann kam es herein?
Ritwik Bose


3
oh ... das war vor 6 Jahren ... Nicht neu von meinem Referenzrahmen: D
Ritwik Bose

2
Ich bin mit Schweinchen zusammen - sechs Jahre bedeuten, dass es praktisch seit Anbeginn der Zeit gibt.
James Moore

0

Der Doppelpunkt existiert tatsächlich in Verbindung mit ?

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

ist äquivalent zu:

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

Auch in der für jede Schleife:

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

buchstäblich:

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

0

Doppelpunkt wird in für jede Schleife verwendet. Versuchen Sie dieses Beispiel.

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);
                   }
       }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.