เครื่องหมายโคลอน (:) ทำอะไรได้บ้าง?


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
Jonik

คำตอบ:


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) เงื่อนไข Ternary ( บทช่วยสอน ):

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
ดี - ฉันพลาดไม่กี่! และฉันไม่รู้ด้วยซ้ำว่าคุณสามารถตั้งชื่อการยืนยันแบบนั้นได้ซึ่งมีประโยชน์มาก
Claudiu

มาจาก. NET (C #) การเปรียบเทียบที่ใกล้เคียงที่สุดสำหรับโครงสร้างที่เป็นปัญหาคือ for-each ซึ่งคุณได้อธิบายไว้อย่างดี
Roger

2
ความล้มเหลวassertไม่ได้ "ออกจากโปรแกรม" มันพ่นAssertionErrorไฟล์. มันจะทำให้โปรแกรมออกก็ต่อเมื่อมันถูกโยนลงบนสแต็กของเธรดที่ไม่ใช่ daemon เท่านั้นที่เหลือ ... และไม่ถูกจับ
Stephen C

หากคุณตั้งเป้าหมายที่จะรวมทั้งหมดฉันจะเพิ่มเครื่องหมายทวิภาค (: :) ตัวดำเนินการ
kiedysktos

1
นอกจากนี้ยังใช้เครื่องหมายทวิภาคคู่ในการอ้างอิงวิธีการ
Daniel M.

34

ไม่มีตัวดำเนินการ "โคลอน" แต่เครื่องหมายทวิภาคจะปรากฏในสองตำแหน่ง:

1: ในตัวดำเนินการ ternary เช่น:

int x = bigInt ? 10000 : 50;

ในกรณีนี้ตัวดำเนินการ ternary ทำหน้าที่เป็น 'if' สำหรับนิพจน์ ถ้า bigInt เป็นจริง x จะได้รับ 10,000 ที่กำหนดให้ ถ้าไม่ 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 และ ternary ใช้เครื่องหมายจุดคู่


ครึ่งหลังช่วยได้นี่น่าจะเป็นคำตอบที่แท้จริง
เอ้อ

+1 สำหรับคำอธิบายเพิ่มเติมเกี่ยวกับสิ่งที่ทำในแต่ละลูป
dfarrell07

18

หากต้องการเพิ่มเมื่อใช้ในแต่ละลูป ":" โดยทั่วไปสามารถอ่านเป็น "in" ได้

ดังนั้น

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

ควรอ่านว่า "สำหรับแต่ละชื่อในชื่อทำ ... "


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 - เขาไม่อยากทำเขาแค่อยากรู้วิธี
Stephen C

3
ไม่ใช่การบ้านอยากรู้ว่าต้องทำยังไงถึงจะเข้าใจตรรกะ
มะนาว

จริงๆแล้วในมหาวิทยาลัย (แย่ ๆ ) ของฉันในระหว่างการเรียนวิศวกรรมคอมพิวเตอร์พวกเขาไม่เคยสอนอะไรเราเกี่ยวกับ (:) ในหลักสูตร java ฉันมาเรียนรู้ในภายหลังโดยดูตัวอย่างและน่าเสียดายที่ตอนนี้ฉันเขียนโค้ดได้ยาก ในความคิดของฉันตั้งแต่ฉันทำโครงการทั้งหมดในทางเดียว
Carlos Sanchez

คุณไม่จำเป็นต้องสมมติว่าlistเป็นตัวอย่างของCollection; ต้องเป็นตัวอย่างIterableว่าสามารถใช้ในการปรับปรุงสำหรับลูปได้หรือไม่ซึ่งหมายความว่าจะมีiterator()วิธีการที่คุณเรียกใช้ในคำตอบของคุณ
Kröw

1

ใช้ในการวนซ้ำเพื่อวนซ้ำรายการวัตถุ

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

นอกเหนือจากตัวอย่างจากโปสเตอร์ต่างๆ

คุณยังสามารถใช้: เพื่อแสดงถึงป้ายกำกับสำหรับบล็อกที่คุณสามารถใช้ร่วมกับการดำเนินการต่อและทำลาย ..

ตัวอย่างเช่น:

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

2
ฉันขอโทษ แต่นั่นเป็นตัวอย่างที่แย่มาก ทำไมคุณไม่เขียนบูลีน isNegative = number> 0; เงื่อนไขด้านท้ายเป็นสิ่งที่ดีสำหรับสิ่งต่างๆเช่น double sgn = number> 0? 1: 0;
user44242

@ user44242 ฮ่า ๆ ใช่ฉันจำไม่ได้ว่าทำไมถึงยกตัวอย่างนั้น
ultrajohn

1
@ user44242 การแสดงตัวอย่างแบบนี้ทำให้ง่ายขึ้นและแสดงให้เห็นว่าตัวดำเนินการตามเงื่อนไขทำงานอย่างไร "ทำไมคุณไม่เขียนบูลีน isNegative = number> 0; " เพราะนั่นไม่ได้แสดงให้เห็นอะไรเกี่ยวกับตัวดำเนินการด้านท้าย
Kröw

1

มันจะพิมพ์สตริง "something" สามครั้ง

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

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

 panel.add(label);             
 }

1
นี่คือสิ่งที่กล่าวข้างต้นในฐานะ ForEach loop
P.JAYASRI

1

เนื่องจากส่วนใหญ่สำหรับลูปนั้นคล้ายกันมาก Java จึงมีทางลัดเพื่อลดจำนวนโค้ดที่ต้องใช้ในการเขียนลูปที่เรียกว่าสำหรับแต่ละลูป

นี่คือตัวอย่างของความกระชับสำหรับแต่ละลูป:

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

ในตัวอย่างด้านบนโคลอน (:) สามารถอ่านได้ว่า "in" สำหรับแต่ละลูปทั้งหมดสามารถอ่านได้ว่า "สำหรับแต่ละองค์ประกอบจำนวนเต็ม (เรียกว่าเกรด) ใน quizGrades ให้พิมพ์ค่าของเกรด"


0

ใช้ในมือสั้นใหม่สำหรับ / ห่วง

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

และตัวดำเนินการที่เกี่ยวข้อง

list.isEmpty() ? true : false;

ฉันไม่รู้ว่ามันใหม่ ... มันเข้ามาเมื่อไหร่?
Ritwik Bose


3
โอ้ ... เมื่อ 6 ปีที่แล้ว ... ไม่ใช่เรื่องใหม่ในกรอบอ้างอิงของฉัน: D
Ritwik Bose

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);
                   }
       }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.