2010-03-08 3 views
70

Я бы посмотрел сам, но я даже не знаю, как это называется. Кто-нибудь возражал бы, объясняя, что он делает?Java: Что делает оператор двоеточия (:)?

Я не знал, что было несколько раз: появилось. Что делать в этом случае здесь:

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

Как бы вы написать этот цикл for-each другим способом, чтобы не включать от «:»?

+4

Другие уже упомянули, что такой случай представляет собой цикл для каждого цикла. Более подробное объяснение того, как это работает, см. Http://java.sun.com/j2se/1.5.0/docs/guide/language/foreach.html – Jonik

ответ

160

Есть несколько мест, двоеточие используется в Java коде:

1) Перепрыжка из этикетки (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) троичное условие (Tutorial):

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

3) Для каждой петли (Tutorial):

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

4) утверждение (Guide):

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) Дело в переключатель заявлении (Tutorial):

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

6) ссылки Метод (Tutorial)

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

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

милый - я пропустил несколько! и я даже не знал, что вы можете назвать подобные утверждения очень полезными. – Claudiu

+0

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

+1

Ошибка 'assert' не« выходила из программы ». Он выдает «AssertionError». Это приведет к тому, что программа выйдет, если она будет сброшена в стек только оставшегося не-демона ... и не будет обнаружена. –

0

Он используется в новой короткой стороны для/петли

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

и оператор троичного

list.isEmpty() ? true : false; 
+0

Я не понимал, что это было новое ... когда это произошло? –

+0

@Mechko, на Java 5: http://java.sun.com/j2se/1.5.0/docs/relnotes/features.html#forloop – Jonik

+3

oh ... это было 6 лет назад ... Не новый мой система отсчета: D –

33

Там нет оператора «двоеточие», но появляется двоеточие в двух местах:

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 
} 

Это устанавливает х для каждого из значений в «вальса» в свою очередь. Поэтому, если vals содержит [10, 20.3, 30, ...], тогда x будет на первой итерации 10, 20.3 на второй и т. Д.

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

+0

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

+0

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

1

Используется для циклов, чтобы перебирать список объектов.

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

Подумайте об этом как for <item> in <list> в Python.

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) 
1

You обычно видят его в тройном назначении оператора;

Синтаксис

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

пример:

boolean isNegative = number > 0 ? false : true; 

, который "эквивалент" в природе к если еще

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

Другие, чем примеры, приведенные различными плакатами,

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

, например:

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

+0

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

1

В вашем конкретном случае,

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

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

Так что, если this.list были набор { "2S", "3Н", "4S"} тогда cardString на конце будет эта строка:

2S 
3H 
4S 
+1

спасибо за ваш ответ. Как этот код можно переписать, чтобы не использовать «:»? – dukevin

14

Как бы вы написали это для -each loop по-другому, чтобы не включать ":"?

Предполагая, что 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.

+0

Мой вопрос: почему? Зачем делать то же самое длинным путем? – RichN

+2

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

+3

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

16

Просто добавьте, если использовать в цикле для каждого цикла, «:» можно в основном читать как «в».

Так

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

следует читать «Для каждого имени в именах сделать ...»

1

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

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

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

panel.add(label);    
} 
+1

вот что сказано выше как цикл ForEach –

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); 
        } 
     } 
} 
1

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

Ниже приведен пример, краткое для каждого цикла:

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

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

Смежные вопросы