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-each
pętlę, aby nie włączać :
?
Odpowiedzi:
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);
źródło
assert
nie powoduje „zamknięcia programu”. RzucaAssertionError
. 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.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.
źródło
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 ..."
źródło
Zakładając, że
list
jest toCollection
instancja ...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ść( ... )
wfor
instrukcji nie jest wyrażeniem ... zgodnie z JLS.źródło
list
jest to wystąpienieCollection
; musi to być przykład,Iterable
jeś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.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.źródło
W Twoim konkretnym przypadku
String cardString = ""; for (PlayingCard c : this.list) // <-- { cardString = cardString + c + "\n"; }
this.list
jest kolekcją (listą, zestawem lub tablicą), a ten kod przypisujec
do każdego elementu kolekcji.Tak więc, jeśli byłaby
this.list
to kolekcja {"2S", "3H", "4S"}, tocardString
na końcu byłby taki ciąg:2S 3H 4S
źródło
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; } } }
źródło
Wypisze napis „coś” trzy razy.
JLabel[] labels = {new JLabel(), new JLabel(), new JLabel()}; for ( JLabel label : labels ) { label.setText("something"); panel.add(label); }
źródło
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”.
źródło
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;
źródło
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)
źródło
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); } } }
źródło