Co robi operator dwukropka (:)?


92

Najwyraźniej dwukropek jest używany na wiele sposobów w Javie. Czy ktoś mógłby wyjaśnić, co to robi?

Na przykład tutaj:

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

Jak inaczej napisałeś tę for-eachpętlę, aby nie włączać :?


4
Inni już wspominali, że taki przypadek to pętla for-each. Bardziej szczegółowe wyjaśnienie, jak to działa, można znaleźć na stronie java.sun.com/j2se/1.5.0/docs/guide/language/foreach.html
Jonik,

Odpowiedzi:


196

W kodzie Java występuje kilka miejsc, w których dwukropek jest używany:

1) Etykieta wyskakująca ( samouczek ):

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) Warunek potrójny ( samouczek ):

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

3) Pętla For-each ( samouczek ):

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

4) Asercja ( przewodnik ):

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) Przypadek w instrukcji przełącznika ( samouczek ):

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

6) Odniesienia do metod ( samouczek )

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

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

3
fajnie - kilka przegapiłem! i nawet nie wiedziałem, że możesz nazwać takie twierdzenia, bardzo przydatne.
Claudiu

Pochodząc z .NET (C #), najbliższą analogią do omawianej struktury byłaby metoda for-each, którą dobrze wyjaśniliście.
Roger,

2
Niepowodzenie assertnie powoduje „zamknięcia programu”. Rzuca AssertionError. Spowoduje to zamknięcie programu tylko wtedy, gdy zostanie wyrzucony na stos jedynego pozostałego wątku niebędącego demonem ... i nie zostanie przechwycony.
Stephen C

jeśli chcesz uwzględnić wszystkie, to dodam podwójny dwukropek (: :) operator
kiedysktos

1
W odniesieniach do metod używany jest również podwójny dwukropek.
Daniel M.,

34

Nie ma operatora „dwukropek”, ale dwukropek występuje w dwóch miejscach:

1: W operatorze trójskładnikowym, np .:

int x = bigInt ? 10000 : 50;

W tym przypadku operator trójskładnikowy działa jak „if” dla wyrażeń. Jeśli bigInt jest true, to x otrzyma przypisane do niego 10000. Jeśli nie, 50. Dwukropek oznacza tutaj „inny”.

2: W pętli for-each:

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

To ustawia x dla każdej z wartości w „vals” po kolei. Więc jeśli vals zawiera [10, 20,3, 30, ...], to x będzie równe 10 w pierwszej iteracji, 20,3 w drugiej itd.

Uwaga: mówię, że to nie jest operator, ponieważ to tylko składnia. Nie może pojawić się sam w żadnym wyrażeniu i jest tylko przypadkiem, że zarówno operator for-each, jak i operator trójskładnikowy używają dwukropka.


druga połowa pomogła, to powinna być prawdziwa odpowiedź
erp

+1 za bardziej szczegółowe wyjaśnienie tego, co robi w pętli for-each.
dfarrell07

18

Wystarczy dodać, że gdy jest używany w pętli for-each, „:” można w zasadzie odczytać jako „in”.

Więc

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

powinno być czytane "Dla każdego imienia IN imiona do ..."


15

Jak inaczej napisałabyś tę pętlę for-each, aby nie zawierać znaku „:”?

Zakładając, że listjest to Collectioninstancja ...

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

Powinienem dodać pedantyczny punkt, który :nie jest operatorem w tym kontekście. Operator wykonuje operację w wyrażeniu, a zawartość ( ... )w forinstrukcji nie jest wyrażeniem ... zgodnie z JLS.


Moje pytanie brzmi: dlaczego? Dlaczego robisz to samo na dłuższą metę?
RichN

2
@RichN - nie chce tego robić, chce tylko wiedzieć, jak.
Stephen C

3
nie praca domowa, chcę wiedzieć, jak to zrobić, aby zrozumieć logikę
cytryna

Właściwie na mojej (złej) uczelni, na studiach informatycznych, nigdy nie nauczyli nas niczego o (:) na kursie java, nauczyłem się go później oglądając przykłady i niestety ciężko mi to teraz zakodować do głowy, ponieważ zrobiłem wszystkie projekty na uniwersytecie od dawna
Carlos Sanchez

Nie musisz zakładać, że listjest to wystąpienie Collection; musi to być przykład, Iterablejeśli można go użyć w rozszerzonej pętli for, co oznacza, że ​​będzie miał iterator()metodę, którą wywołasz w odpowiedzi.
Kröw

1

Jest używany w pętlach for do iteracji po liście obiektów.

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

Potraktuj to jak for <item> in <list>w Pythonie.


1

W Twoim konkretnym przypadku

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

this.listjest kolekcją (listą, zestawem lub tablicą), a ten kod przypisuje cdo każdego elementu kolekcji.

Tak więc, jeśli byłaby this.listto kolekcja {"2S", "3H", "4S"}, to cardStringna końcu byłby taki ciąg:

2S
3H
4S

1
dzięki za odpowiedź. Jak można przepisać ten kod, aby nie używał znaku „:”?
cytryna

1

Zwykle widzisz to w trójskładnikowym operatorze przypisania;

Składnia

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

przykład:

boolean isNegative = number > 0 ? false : true;

który ma charakter „równoważny” z if else

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

Inne niż przykłady podane na różnych plakatach,

możesz również użyć: do oznaczenia etykiety dla bloku, której możesz użyć w połączeniu z kontynuowaniem i przerwaniem.

na przykład:

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

2
Przepraszam, ale to okropny przykład. Dlaczego nie napisałbyś boolean isNegative = liczba> 0; Warunki trójskładnikowe są dobre dla rzeczy takich jak podwójny sgn = liczba> 0? 1: 0;
user44242

@ user44242 lol tak, nawet nie pamiętam, dlaczego podałem ten przykład.
ultrajohn

1
@ user44242 Przedstawienie takiego przykładu sprawia, że ​​jest on prosty i lepiej pokazuje, jak działa operator warunkowy. „ Dlaczego by nie napisać boolean isNegative = liczba> 0; ” Ponieważ to nie pokazuje niczego na temat operatora trójskładnikowego.
Kröw

1

Wypisze napis „coś” trzy razy.

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

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

 panel.add(label);             
 }

1
to właśnie zostało powiedziane powyżej jako pętla
ForEach

1

Ponieważ większość pętli for jest bardzo podobnych, Java udostępnia skrót do zmniejszenia ilości kodu wymaganego do napisania pętli zwanej pętlą for each.

Oto przykład zwięzłego dla każdej pętli:

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

W powyższym przykładzie dwukropek (:) można odczytać jako „w”. Wszystkie pętle dla każdej pętli można odczytać jako „dla każdego elementu Integer (nazywanego stopniem) w quizGrades, wypisz wartość oceny”.


0

Jest używany w nowej krótkiej ręce for / loop

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

i operator trójskładnikowy

list.isEmpty() ? true : false;

Nie zdawałem sobie sprawy, że to było takie nowe ... kiedy to się pojawiło?
Ritwik Bose


3
och ... to było 6 lat temu ... Nie nowość w moim układzie odniesienia: D
Ritwik Bose

2
Jestem z piggles - sześć lat oznacza, że ​​istnieje praktycznie od zarania dziejów.
James Moore,

0

Okrężnica faktycznie istnieje w połączeniu z ?

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

jest równa:

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

Również w każdej pętli:

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

dosłownie:

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

0

dwukropek używa w pętli for-each, wypróbuj ten przykład,

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);
                   }
       }
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.