Toán tử dấu hai chấm (:) làm gì?


91

Rõ ràng dấu hai chấm được sử dụng theo nhiều cách trong Java. Có ai vui lòng giải thích nó làm gì không?

Ví dụ ở đây:

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

Làm thế nào bạn sẽ viết for-eachvòng lặp này theo một cách khác để không kết hợp :?


4
Những người khác đã đề cập rằng trường hợp như vậy là một vòng lặp cho mỗi. Để có giải thích chi tiết hơn về cách hoạt động của nó, hãy xem java.sun.com/j2se/1.5.0/docs/guide/language/foreach.html
Jonik

Câu trả lời:


195

Có một số chỗ dấu hai chấm được sử dụng trong mã Java:

1) Nhãn nhảy ra ( Hướng dẫn ):

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) Điều kiện bậc ba ( Hướng dẫn ):

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

3) Đối với từng vòng lặp ( Hướng dẫn ):

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

4) Khẳng định ( Hướng dẫn ):

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) Trường hợp trong câu lệnh chuyển đổi ( Hướng dẫn ):

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

6) Tham chiếu phương pháp ( Hướng dẫn )

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

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

3
tốt - tôi đã bỏ lỡ một vài! và tôi thậm chí không biết bạn có thể đặt tên cho các xác nhận như vậy, rất hữu ích.
Claudiu

Đến từ .NET (C #), cấu trúc tương tự gần nhất cho cấu trúc được đề cập sẽ là for-each, mà bạn đã giải thích theo cách tốt.
Roger

2
A không thành công assertkhông "thoát khỏi chương trình". Nó ném một AssertionError. Nó sẽ chỉ khiến chương trình thoát ra nếu nó được ném vào ngăn xếp của luồng không phải daemon duy nhất còn lại ... và không bị bắt.
Stephen C

nếu bạn đặt mục tiêu bao gồm tất cả, sau đó tôi sẽ thêm dấu hai chấm đôi (: :) điều hành
kiedysktos

1
Ngoài ra, dấu hai chấm được sử dụng trong các tham chiếu phương thức.
Daniel M.

34

Không có toán tử "dấu hai chấm", nhưng dấu hai chấm xuất hiện ở hai nơi:

1: Trong toán tử bậc ba, ví dụ:

int x = bigInt ? 10000 : 50;

Trong trường hợp này, toán tử bậc ba hoạt động như một 'if' cho các biểu thức. Nếu bigInt là true, thì x sẽ được gán 10000 cho nó. Nếu không, 50. Dấu hai chấm ở đây có nghĩa là "khác".

2: Trong vòng lặp for-each:

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

Điều này lần lượt đặt x thành từng giá trị trong 'vals'. Vì vậy, nếu vals chứa [10, 20.3, 30, ...], thì x sẽ là 10 ở lần lặp đầu tiên, 20.3 ở lần thứ hai, v.v.

Lưu ý: Tôi nói nó không phải là một toán tử vì nó chỉ là cú pháp. Nó không thể tự xuất hiện trong bất kỳ biểu thức đã cho nào và chỉ có thể là cả toán tử for-each và toán tử bậc ba đều sử dụng dấu hai chấm.


hiệp hai đã giúp, đây sẽ là câu trả lời thực sự
erp

+1 để được giải thích chi tiết hơn về những gì nó đang làm trong mỗi vòng lặp.
dfarrell07

18

Chỉ cần nói thêm, khi được sử dụng trong vòng lặp for-each, về cơ bản, ":" có thể được đọc là "in".

Vì thế

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

nên được đọc "Đối với mỗi tên IN tên do ..."


15

Làm thế nào bạn sẽ viết điều này cho mỗi vòng lặp theo một cách khác nhau để không kết hợp ":"?

Giả sử đó listlà một Collectionví dụ ...

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

Tôi nên thêm điểm ngữ nghĩa :không phải là toán tử trong ngữ cảnh này. Một toán tử thực hiện một thao tác trong một biểu thức và nội dung bên ( ... )trong một forcâu lệnh không phải là một biểu thức ... theo JLS.


Câu hỏi của tôi là: tại sao? Tại sao làm điều tương tự trong một chặng đường dài?
RichN

2
@RichN - anh ấy không muốn làm điều đó, anh ấy chỉ muốn biết làm thế nào.
Stephen C

3
không bài tập về nhà, tôi muốn biết làm thế nào để làm điều đó một chặng đường dài để tôi có thể hiểu được logic
chanh

Thực ra ở trường đại học (tồi tệ) của tôi, trong quá trình học kỹ thuật máy tính, họ không bao giờ dạy chúng tôi bất cứ điều gì về (:) trong khóa học java, tôi đã tìm hiểu nó sau đó bằng cách xem các ví dụ, và thật không may, bây giờ tôi rất khó viết mã nó trong tâm trí tôi vì tôi đã thực hiện tất cả các dự án trong một chặng đường dài
Carlos Sanchez

Bạn không cần phải cho rằng đó listlà một ví dụ của Collection; nó phải là một trường hợp Iterablenếu nó có thể được sử dụng trong vòng lặp for nâng cao, nghĩa là nó sẽ có iterator()phương thức mà bạn gọi nó trong câu trả lời của mình.
Kröw

1

Nó được sử dụng trong vòng lặp for để lặp lại danh sách các đối tượng.

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

Hãy nghĩ về nó như một for <item> in <list>trong Python.


1

Trong trường hợp cụ thể của bạn,

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

this.listlà một tập hợp (danh sách, tập hợp hoặc mảng) và mã đó sẽ gán ccho từng phần tử của tập hợp.

Vì vậy, nếu this.listlà một tập hợp {"2S", "3H", "4S"} thì cardStringở cuối sẽ là chuỗi sau:

2S
3H
4S

1
cảm ơn câu trả lời của bạn. Làm thế nào mã này có thể được viết lại để không sử dụng ":"?
chanh

1

Bạn thường thấy nó trong toán tử gán bậc ba;

Cú pháp

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

thí dụ:

boolean isNegative = number > 0 ? false : true;

về bản chất "tương đương" với if else

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

Ngoài các ví dụ được đưa ra bởi các áp phích khác nhau,

bạn cũng có thể sử dụng: để biểu thị nhãn cho một khối mà bạn có thể sử dụng kết hợp với tiếp tục và ngắt ..

ví dụ:

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

2
Tôi xin lỗi, nhưng đó là một ví dụ tồi tệ. Tại sao bạn không viết boolean isNegative = number> 0; Điều kiện bậc ba là tốt cho những thứ chẳng hạn như double sgn = number> 0? 1: 0;
user44242 Ngày

@ user44242 lol vâng tôi thậm chí không nhớ tại sao tôi đưa ra ví dụ đó.
ultrajohn

1
@ user44242 Hiển thị một ví dụ như vậy giúp nó đơn giản và hiển thị tốt hơn cách toán tử điều kiện hoạt động. " Tại sao bạn không viết boolean isNegative = number> 0; " Bởi vì điều đó không chứng minh bất cứ điều gì về toán tử bậc ba.
Kröw

1

Nó sẽ in chuỗi "something" ba lần.

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

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

 panel.add(label);             
 }

1
đây là những gì đã nói ở trên dưới dạng vòng lặp ForEach
P.JAYASRI Ngày

1

Vì hầu hết các vòng lặp for đều rất giống nhau, Java cung cấp một phím tắt để giảm lượng mã cần thiết để viết vòng lặp được gọi là for mỗi vòng lặp.

Đây là một ví dụ về sự ngắn gọn cho mỗi vòng lặp:

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

Trong ví dụ trên, dấu hai chấm (:) có thể được đọc là "in". Hoàn toàn có thể đọc cho mỗi vòng lặp là "đối với mỗi phần tử Số nguyên (được gọi là lớp) trong quizGrades, in ra giá trị của điểm."


0

Nó được dùng trong vòng lặp for / ngắn hạn mới

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

và toán tử bậc ba

list.isEmpty() ? true : false;

Tôi không nhận ra nó mới như vậy ... nó đến từ khi nào?
Ritwik Bose


3
oh ... đó là 6 năm trước ... Không mới bằng khung của tôi về tài liệu tham khảo: D
Ritwik Bose

2
Tôi với những chú heo con - sáu năm có nghĩa là nó đã tồn tại gần như từ buổi bình minh của thời gian.
James Moore

0

Dấu hai chấm thực sự tồn tại cùng với ?

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

tương đương với:

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

Cũng trong vòng lặp cho mỗi:

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

theo nghĩa đen:

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

0

dấu hai chấm đang sử dụng trong vòng lặp for-each, Hãy thử ví dụ này,

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);
                   }
       }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.