Що робить оператор двокрапки (:)?


89

Очевидно, двокрапка в Java використовується по-різному. Хтось би не пояснив, що це робить?

Наприклад, тут:

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

Як би ви написали цей for-eachцикл по-іншому, щоб не включати :?


4
Інші вже згадували, що такий випадок є циклом для кожного. Для більш детального пояснення того , як вона працює, см java.sun.com/j2se/1.5.0/docs/guide/language/foreach.html
Jonik

Відповіді:


193

Існує кілька місць, де в коді Java використовується двокрапка:

1) Етикетка, що вискакує ( Підручник ):

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) Трійковий стан ( Підручник ):

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

3) Для кожного циклу ( Підручник ):

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

4) Твердження ( керівництво ):

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) Випадок у заяві на перемикач ( Підручник ):

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

6) Посилання на методи ( Підручник )

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

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

3
приємно - я пропустив кілька! і я навіть не знав, що ти можеш називати такі твердження дуже корисними.
Клаудіу

Виходячи з .NET (C #), найближчою аналогією для розглянутої структури буде метод for-each, який ви добре пояснили.
Роджер

2
Помилка assertне "виходить із програми". Він кидає AssertionError. Це призведе до того, що програма вийде з програми, лише якщо вона буде кинута в стек єдиного залишку, що не є демоном ... і не перехоплена.
Stephen C

якщо ви прагнете включити все, то я додав би подвійну двокрапку (: :) оператор
kiedysktos

1
Крім того, у посиланнях на методи використовується подвійна двокрапка.
Даніель М.

34

Оператора "двокрапка" не існує, але двокрапка з’являється у двох місцях:

1: У тернарному операторі, наприклад:

int x = bigInt ? 10000 : 50;

У цьому випадку тернарний оператор діє як "якщо" для виразів. Якщо bigInt істинно, то x отримає 10000, призначених йому. Якщо ні, 50. Двокрапка тут означає "ще".

2: У циклі для кожного:

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

Це встановлює x для кожного зі значень у 'vals' по черзі. Отже, якщо vals містить [10, 20.3, 30, ...], то x буде 10 на першій ітерації, 20.3 на другій тощо.

Примітка: Я кажу, що це не оператор, оскільки це просто синтаксис. Він не може відображатися в будь-якому даному виразі сам по собі, і це лише шанс, що і для кожного, і для потрійного оператора використовують двокрапку.


допоміг другий тайм, це мала б бути справжня відповідь
erp

+1 для більш детального пояснення того, що він робить для кожного циклу.
dfarrell07

18

Просто додамо, що при використанні в циклі for-for кожен символ ":" може бути прочитаний як "in".

Тому

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

слід читати "Для кожного імені IN імена роблять ..."


15

Як би ви написали це для кожного циклу по-різному, щоб не включати ":"?

Якщо припустити, що listце Collectionекземпляр ...

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

Я повинен додати педантичну думку, яка :не є оператором у цьому контексті. Оператор виконує операцію в вираженні, і матеріал всередині ( ... )в forзаяві не є виразом ... в відповідно до JLS.


Моє питання: чому? Навіщо робити те саме довгий шлях?
RichN

2
@RichN - він не хоче цього робити, він просто хоче знати, як.
Стівен С

3
не домашнє завдання, я хочу знати, як це зробити довгий шлях, щоб я міг зрозуміти логіку
лимон

Насправді в моєму (поганому) університеті, під час навчання на комп'ютерній інженерії, вони ніколи не вчили нас нічого про (:) на курсі Java, я прийшов дізнатися його пізніше, переглядаючи приклади, і, на жаль, мені зараз важко його кодувати Я пам’ятаю, оскільки всі проекти в університеті я робив довгим шляхом
Карлос Санчес,

Вам не потрібно вважати, що listце екземпляр Collection; він повинен бути екземпляром, Iterableякщо його можна використовувати в розширеному циклі for, тобто він матиме iterator()метод, який ви викликаєте до нього у своїй відповіді.
Кров,

1

Він використовується в циклах for для перебору списку об’єктів.

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

Подумайте про це як про for <item> in <list>Python.


1

У вашому конкретному випадку,

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

this.list є колекцією (списком, набором або масивом), і цей код призначає c кожному елементу колекції.

Отже, якби this.listколекція {"2S", "3H", "4S"}, тоді cardStringв кінці був би такий рядок:

2S
3H
4S

1
Дякую за вашу відповідь. Як можна переписати цей код, щоб не використовувати ":"?
лимон

1

Зазвичай ви бачите це в операторі тернарного присвоєння;

Синтаксис

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

приклад:

boolean isNegative = number > 0 ? false : true;

який за своєю суттю "еквівалентний", якщо інший

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

Крім прикладів, наведених різними плакатами,

Ви також можете використовувати: для позначення мітки для блоку, який ви можете використовувати разом із продовженням та розривом ..

наприклад:

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

2
Вибачте, але це жахливий приклад. Чому б вам не написати логічне значення isNegative = number> 0; Трійкові умови хороші для таких речей, як подвійне sgn = число> 0? 1: 0;
user44242

@ user44242 ха-ха так, я навіть не пам'ятаю, чому я дав такий приклад.
ultrajohn

1
@ user44242 Показ такого прикладу робить його простим і краще показує, як працює умовний оператор. " Чому б вам не написати boolean isNegative = number> 0; " Тому що це нічого не демонструє про тернарний оператор.
Кров,

1

Він три рази надрукує рядок "щось".

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

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

 panel.add(label);             
 }

1
це те, що було сказано вище як цикл ForEach
P.JAYASRI

1

Оскільки більшість циклів for дуже схожі, Java пропонує ярлик для зменшення кількості коду, необхідного для запису циклу, що називається для кожного циклу.

Ось приклад стислості для кожного циклу:

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

У наведеному вище прикладі двокрапку (:) можна прочитати як "в". Взагалі для кожного циклу можна прочитати як "для кожного цілого елемента (званого оцінкою) у quizGrades, роздрукуйте значення оцінки".


0

Він використовується в новій короткій руці для / циклу

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

і потрійний оператор

list.isEmpty() ? true : false;

Я не розумів, що це все нове ... коли воно з’явилося?
Рітвік Бозе


3
о ... це було 6 років тому ... Не нове за моєю системою відліку: D
Рітвік Бозе

2
Я з поросятами - шість років означає, що це було практично з самого початку часу.
James Moore

0

Товста кишка насправді існує спільно з ?

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

еквівалентно:

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

Також у кожному циклі:

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

буквально:

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

0

двокрапка використовується для кожного циклу, спробуйте цей приклад,

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);
                   }
       }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.