Что делает оператор двоеточия (:)?


92

Очевидно, двоеточие используется в 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
Джоник,

Ответы:


196

В 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 ( Учебник ):

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
приятно - несколько пропустил! и я даже не знал, что вы можете назвать такие утверждения очень полезными.
Claudiu

Исходя из .NET (C #), наиболее близкой аналогией для рассматриваемой структуры будет for-each, что вы хорошо объяснили.
Роджер

2
Неудачный assertне «выходит из программы». Выдает файл AssertionError. Это приведет к завершению программы только в том случае, если она будет выброшена в стек единственного оставшегося недемонического потока ... и не поймана.
Stephen C

если вы хотите включить все, то я бы добавил оператор с двойным двоеточием (: :)
kiedysktos

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

34

Оператора "двоеточие" нет, но двоеточие встречается в двух местах:

1: В тернарном операторе, например:

int x = bigInt ? 10000 : 50;

В этом случае тернарный оператор действует как if для выражений. Если 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 на второй и т. Д.

Примечание: я говорю, что это не оператор, потому что это просто синтаксис. Сама по себе она не может появиться ни в одном выражении, и вполне вероятно, что и for-each, и тернарный оператор используют двоеточие.


Вторая половина помогла, это должен быть реальный ответ
erp

+1 для более подробного объяснения того, что он делает в каждом цикле.
dfarrell07

18

Просто добавим, что при использовании в цикле for-each ":" можно в основном читать как "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";
   }
}

Я должен добавить педантичный момент, который :не является оператором в данном контексте. Оператор выполняет операцию в выражении, а содержимое внутри оператора ( ... )in forне является выражением ... согласно JLS.


У меня вопрос: почему? Зачем делать то же самое долгое время?
RichN

2
@RichN - он не хочет этого делать, он просто хочет знать, как.
Stephen C

3
не домашнее задание, я хочу знать, как это делать долго, чтобы я мог понять логику
лимон

На самом деле в моем (плохом) университете, во время учебы в области компьютерной инженерии, нам ничего не рассказывали о (:) в курсе java, я приехал, чтобы узнать его позже, просмотрев примеры, и, к сожалению, мне сейчас сложно его кодировать в моей голове, так как я проделал долгий путь над всеми проектами в университете
Карлос Санчес

Вам не нужно предполагать, что listэто экземпляр Collection; он должен быть экземпляром того, можно Iterableли его использовать в расширенном цикле for, что означает, что он будет иметь iterator()метод, который вы вызываете для него в своем ответе.
Kröw

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 else

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

Помимо примеров, приведенных на разных плакатах,

вы также можете использовать: для обозначения метки для блока, которую вы можете использовать вместе с continue и break ..

например:

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

2
Мне очень жаль, но это ужасный пример. Почему бы вам не написать boolean isNegative = number> 0; Тернарные условия хороши для таких вещей, как double sgn = number> 0? 1: 0;
user44242 08

@ user44242 lol да, я даже не помню, зачем привел этот пример.
ultrajohn

1
@ user44242 Подобный пример упрощает работу и лучше показывает, как работает условный оператор. « Почему бы вам не написать boolean isNegative = number> 0; » Потому что это ничего не демонстрирует о тернарном операторе.
Kröw

1

Он напечатает строку «что-то» три раза.

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

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

 panel.add(label);             
 }

1
это то, что было сказано выше как цикл ForEach
П.ДЖАЯСРИ

1

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

Вот пример краткого описания каждого цикла:

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

В приведенном выше примере двоеточие (:) можно читать как «in». Для каждого цикла в целом можно прочитать как «для каждого элемента Integer (называемого оценкой) в quizGrades распечатайте значение оценки».


0

Он используется в новом сокращении for / loop

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

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

list.isEmpty() ? true : false;

Я не понимал, что это было так ново ... когда оно появилось?
Ritwik Bose 08


3
ох ... это было 6 лет назад ... Не
новость, исходя из моих взглядов

2
Я с свиньями - шесть лет означают, что это было практически с незапамятных времен.
Джеймс Мур,

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.