Apa yang dilakukan operator titik dua (:)?

92

Rupanya titik dua digunakan dalam berbagai cara di Jawa. Adakah yang keberatan menjelaskan apa yang dilakukannya?

Misalnya di sini:

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

Bagaimana Anda akan menulis for-eachloop ini dengan cara yang berbeda agar tidak menyertakan :?

lemon
sumber
4
Orang lain telah menyebutkan bahwa kasus seperti itu adalah untuk setiap loop. Untuk penjelasan lebih rinci tentang cara kerjanya, lihat java.sun.com/j2se/1.5.0/docs/guide/language/foreach.html
Jonik

Jawaban:

196

Ada beberapa tempat titik dua digunakan dalam kode Java:

1) Label lompat ( 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) Kondisi terner ( Tutorial ):

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

3) Untuk setiap loop ( Tutorial ):

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

4) Pernyataan ( Panduan ):

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) Kasus dalam pernyataan switch ( Tutorial ):

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

6) Referensi metode ( Tutorial )

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

Arrays.sort(persons, Person::compareByAge);
Randy Sugianto 'Yuku'
sumber
3
bagus - Saya melewatkan beberapa! dan saya bahkan tidak tahu Anda dapat menyebutkan pernyataan seperti itu, sangat berguna.
Claudiu
Berasal dari .NET (C #), analogi terdekat untuk struktur tersebut adalah untuk masing-masing, yang Anda jelaskan dengan cara yang baik.
Roger
2
A gagal asserttidak "keluar dari program". Ini melempar AssertionError. Ini hanya akan menyebabkan program keluar jika dilempar ke tumpukan dari satu-satunya utas non-daemon yang tersisa ... dan tidak tertangkap.
Stephen C
jika Anda bermaksud untuk memasukkan semua, maka saya akan menambahkan titik dua ganda (: :) operator
kiedysktos
1
Juga, titik dua ganda digunakan dalam referensi metode.
Daniel M.
34

Tidak ada operator "titik dua", tetapi titik dua muncul di dua tempat:

1: Di operator terner, mis:

int x = bigInt ? 10000 : 50;

Dalam hal ini, operator terner bertindak sebagai 'jika' untuk ekspresi. Jika bigInt benar, maka x akan mendapatkan 10000 yang ditugaskan padanya. Jika tidak, 50. Titik dua di sini berarti "lain".

2: Dalam untuk setiap loop:

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

Ini menetapkan x ke setiap nilai di 'vals' secara bergantian. Jadi jika vals berisi [10, 20.3, 30, ...], maka x akan menjadi 10 pada iterasi pertama, 20,3 pada iterasi kedua, dst.

Catatan: Saya katakan ini bukan operator karena ini hanya sintaks. Itu tidak dapat muncul dalam ekspresi tertentu dengan sendirinya, dan itu hanya kebetulan bahwa operator for-each dan terner menggunakan titik dua.

Claudiu
sumber
paruh kedua membantu, ini seharusnya menjadi jawaban yang sebenarnya
erp
1 untuk penjelasan yang lebih panjang tentang apa yang dilakukannya di setiap loop.
dfarrell07
18

Sebagai tambahan, saat digunakan dalam for-each loop, ":" pada dasarnya dapat dibaca sebagai "in".

Begitu

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

harus dibaca "Untuk setiap nama DI nama melakukan ..."

metode pembantu
sumber
15

Bagaimana Anda akan menulis ini untuk setiap pengulangan dengan cara yang berbeda agar tidak menyertakan ":"?

Dengan asumsi itu listadalah Collectioncontoh ...

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

Saya harus menambahkan titik pedantic yang :bukan merupakan operator dalam konteks ini. Operator melakukan operasi dalam ekspresi, dan hal-hal di ( ... )dalam forpernyataan bukanlah ekspresi ... menurut JLS.

Stephen C
sumber
Pertanyaan saya adalah: mengapa? Mengapa melakukan hal yang sama jauh-jauh?
RichN
2
@RichN - dia tidak ingin melakukannya, dia hanya ingin tahu caranya.
Stephen C
3
bukan pekerjaan rumah, saya ingin tahu bagaimana melakukannya jauh-jauh sehingga saya bisa memahami logikanya
lemon
Sebenarnya di universitas saya (buruk), selama studi teknik komputer, mereka tidak pernah mengajari kami apa pun tentang (:) di kursus java, saya datang untuk mempelajarinya nanti dengan melihat contoh, dan sayangnya, sulit bagi saya sekarang untuk mengkodekannya ke dalam pikiran saya sejak saya melakukan semua proyek di universitas jauh
Carlos Sanchez
Anda tidak perlu berasumsi bahwa itu listadalah turunan dari Collection; itu harus berupa contoh Iterablejika dapat digunakan dalam loop for yang ditingkatkan, yang berarti ia akan memiliki iterator()metode yang Anda panggil dalam jawaban Anda.
Kröw
1

Ini digunakan dalam for loop untuk mengulang daftar objek.

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

Anggap saja sebagai dengan for <item> in <list>Python.

Mike Cialowicz
sumber
1

Dalam kasus khusus Anda,

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

this.listadalah koleksi (daftar, set, atau larik), dan kode tersebut menetapkan cke setiap elemen koleksi.

Jadi, jika this.listsebuah koleksi {"2S", "3H", "4S"} maka cardStringpada akhirnya adalah string ini:

2S
3H
4S
Randy Sugianto 'Yuku'
sumber
1
Terima kasih atas jawaban anda. Bagaimana kode ini dapat ditulis ulang untuk tidak menggunakan ":"?
lemon
1

Anda biasanya melihatnya di operator penugasan terner;

Sintaksis

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

contoh:

boolean isNegative = number > 0 ? false : true;

yang "setara" di alam dengan if else

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

Selain contoh yang diberikan oleh poster yang berbeda,

Anda juga dapat menggunakan: untuk menandakan label untuk sebuah blok yang dapat Anda gunakan dalam hubungannya dengan lanjutkan dan putus ..

sebagai contoh:

public void someFunction(){
     //an infinite loop
     goBackHere: { //label
          for(int i = 0; i < 10 ;i++){
               if(i == 9 ) continue goBackHere;
          }
     }
}
ultrajohn
sumber
2
Maaf, tapi itu contoh yang buruk. Mengapa Anda tidak menulis boolean isNegative = number> 0; Kondisi terner baik untuk hal-hal seperti double sgn = number> 0? 1: 0;
pengguna44242
@ user44242 lol ya saya bahkan tidak ingat mengapa saya memberikan contoh itu.
ultrajohn
1
@ user44242 Menampilkan contoh seperti itu membuatnya tetap sederhana dan lebih baik menunjukkan bagaimana operator bersyarat bekerja. " Mengapa Anda tidak menulis boolean isNegative = number> 0; " Karena itu tidak mendemonstrasikan apa pun tentang operator terner.
Kröw
1

Ini akan mencetak string "sesuatu" tiga kali.

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

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

 panel.add(label);             
 }
Saurav Sahu
sumber
1
inilah yang dikatakan di atas sebagai loop
ForEach
1

Karena kebanyakan for loop sangat mirip, Java menyediakan jalan pintas untuk mengurangi jumlah kode yang diperlukan untuk menulis loop yang dipanggil untuk setiap loop.

Berikut adalah contoh ringkasan untuk setiap loop:

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

Pada contoh di atas, titik dua (:) bisa dibaca sebagai "dalam". Untuk setiap loop dapat dibaca sebagai "untuk setiap elemen Integer (disebut nilai) di quizGrades, cetak nilai grade."

Pengembang lunak
sumber
0

Ini digunakan di tangan pendek baru untuk / loop

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

dan operator terner

list.isEmpty() ? true : false;

sumber
Saya tidak menyadari itu baru ... kapan itu masuk?
Ritwik Bose
3
oh ... itu 6 tahun yang lalu ... Bukan hal baru menurut kerangka acuan saya: D
Ritwik Bose
2
Saya dengan piggles - enam tahun berarti sudah ada sejak awal waktu.
James Moore
0

Titik dua sebenarnya ada dalam hubungannya dengan ?

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

setara dengan:

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

Juga di untuk setiap loop:

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

secara harfiah:

for(Node n = l.head; n.next != null; n = n.next)
Ritwik Bose
sumber
0

titik dua digunakan di untuk setiap pengulangan, Coba contoh ini,

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);
                   }
       }
}
Saurabh Srivastava
sumber