İki nokta üst üste (:) operatörü ne yapar?


92

Görünüşe göre Java'da iki nokta üst üste birden çok şekilde kullanılıyor. Ne yaptığını açıklamanın sakıncası var mı?

Örneğin burada:

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

Bu for-eachdöngüyü nasıl farklı bir şekilde yazarsınız :?


4
Başkaları zaten böyle bir durumun her döngü için bir döngü olduğunu belirtmişlerdir. Nasıl çalıştığını daha ayrıntılı bir açıklama için bkz java.sun.com/j2se/1.5.0/docs/guide/language/foreach.html
Jonik

Yanıtlar:


196

Java kodunda iki nokta üst üste kullanılan birkaç yer vardır:

1) Jump-out etiketi ( Eğitim ):

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) Üçlü durum ( Eğitim ):

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

3) Her döngü için ( Eğitim ):

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

4) İddia ( Kılavuz ):

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 ifadesindeki durum ( Eğitim ):

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

6) Yöntem referansları ( Eğitim )

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

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

3
güzel - birkaçını kaçırdım! ve bunun gibi iddiaları sayabileceğinizi bile bilmiyordum, çok faydalı.
Claudiu

NET'ten (C #) gelince, söz konusu yapıya en yakın benzetme, iyi bir şekilde açıkladığınız her biri için olacaktır.
Roger

2
Başarısız bir assert"programdan çıkmaz". Bir atar AssertionError. Yalnızca, kalan tek arka plan programı olmayan iş parçacığının yığınına atılırsa ve yakalanmazsa programın çıkmasına neden olur.
Stephen C

hepsini dahil etmeyi hedefliyorsanız, çift iki nokta üst üste eklerim (: :) operatörü
kiedysktos

1
Ayrıca, yöntem referanslarında çift nokta kullanılır.
Daniel M.

34

"İki nokta" operatörü yoktur, ancak iki nokta iki yerde görünür:

1: Üçlü operatörde, örneğin:

int x = bigInt ? 10000 : 50;

Bu durumda, üçlü operatör, ifadeler için bir 'eğer' işlevi görür. BigInt doğruysa, x kendisine 10000 atanmış olacaktır. Değilse, 50. Buradaki iki nokta üst üste "başka" anlamına gelir.

2: Her döngüde:

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

Bu, x'i sırayla 'vals'deki değerlerin her birine ayarlar. Dolayısıyla, vals [10, 20.3, 30, ...] içeriyorsa, x ilk yinelemede 10, ikincide 20.3 vb. Olacaktır.

Not: Bunun bir operatör olmadığını çünkü sadece sözdizimi olduğunu söylüyorum. Herhangi bir ifadede kendi başına görünemez ve hem her biri için hem de üçlü operatörün iki nokta üst üste kullanması şanstır.


ikinci yarı yardımcı oldu, gerçek cevap bu olmalı
erp

Her döngüde ne yaptığının daha ayrıntılı açıklaması için +1.
dfarrell07

18

Eklemek gerekirse, her döngüde kullanıldığında, ":" temelde "içinde" olarak okunabilir.

Yani

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

okunmalıdır "Her isim için IN isimleri yapın ..."


15

Bunu her döngü için ":" eklememek için farklı bir şekilde nasıl yazarsınız?

Bunun listbir Collectionörnek olduğunu varsayarsak ...

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

:Bu bağlamda operatör olmayan bilgiçlik noktasını eklemeliyim . Bir operatör, bir ifadede bir operasyon gerçekleştirir ve iç malzeme ( ... )bir de foraçıklamaya JLS göre ... bir ifade değildir.


Sorum şu: neden? Neden aynı şeyi uzun yoldan yapıyor?
RichN

2
@RichN - bunu yapmak istemiyor, sadece nasıl yapılacağını bilmek istiyor.
Stephen C

3
ödev değil, mantığını anlayabilmek için uzun yoldan nasıl yapacağımı bilmek istiyorum
limon

Aslında benim (kötü) üniversitemde, bilgisayar mühendisliği çalışmaları sırasında bize java dersinde (:) ile ilgili hiçbir şey öğretmediler, daha sonra örnekler izleyerek öğrenmeye geldim ve maalesef kodlamak benim için çok zor. üniversitedeki tüm projeleri uzun yoldan yaptığımdan beri aklıma
Carlos Sanchez

Bunun listbir örneği olduğunu varsaymanıza gerek yok Collection; o Iterablegelişmiş for döngüsünde kullanılıp kullanılamayacağının bir örneği olmalıdır , yani iterator()cevabınızda çağıracağınız yönteme sahip olacaktır .
Kröw

1

Döngülerin bir nesne listesi üzerinde yinelemesi için kullanılır.

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

for <item> in <list>Python'da olduğu gibi düşünün .


1

Özel durumunuzda,

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

this.listbir koleksiyondur (liste, küme veya dizi) ve bu kod c, koleksiyonun her bir öğesine atar .

Dolayısıyla, this.listbir koleksiyon {"2S", "3H", "4S"} cardStringolsaydı, sondaki şu dize olurdu:

2S
3H
4S

1
Cevabınız için teşekkürler. Bu kod ":" kullanılmayacak şekilde nasıl yeniden yazılabilir?
limon

1

Bunu genellikle üçlü atama operatöründe görürsünüz;

Sözdizimi

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

misal:

boolean isNegative = number > 0 ? false : true;

doğası gereği "if else" e eşdeğer olan

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

Farklı posterlerin verdiği örnekler dışında,

Ayrıca şunu da kullanabilirsiniz: devam et ve kes ile birlikte kullanabileceğiniz bir blok için bir etiket belirtmek için ..

Örneğin:

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

2
Üzgünüm ama bu çok kötü bir örnek. Neden boole yazmıyorsun isNegative = sayı> 0; Üçlü koşullar, çift sgn = sayı> 0? Gibi şeyler için iyidir. 1: 0;
user44242

@ user44242 lol evet bu örneği neden verdiğimi bile hatırlamıyorum.
ultrajohn

1
@ user44242 Böyle bir örnek göstermek, işi basitleştirir ve koşullu operatörün nasıl çalıştığını daha iyi gösterir. " Neden boolean isNegative = sayı> 0 yazmıyorsunuz; " Çünkü bu üçlü operatör hakkında hiçbir şey göstermiyor.
Kröw

1

Üç kez "bir şeyler" dizesini yazdıracaktır.

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

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

 panel.add(label);             
 }

1
yukarıda ForEach döngüsü olarak söylenen budur
P.JAYASRI

1

Döngülerin çoğu çok benzer olduğundan, Java her döngü için olarak adlandırılan döngüyü yazmak için gereken kod miktarını azaltmak için bir kısayol sağlar.

İşte her döngü için kısa bir örnek:

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

Yukarıdaki örnekte, iki nokta üst üste (:) "içinde" olarak okunabilir. Her döngü için, "quizGrades'teki her Tamsayı öğesi için (not olarak adlandırılır) notun değerini yazdırın" şeklinde okunabilir.


0

Yeni kısa el / döngüde kullanılır

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

ve üçlü operatör

list.isEmpty() ? true : false;

O kadar yeni olduğunu fark etmemiştim ... ne zaman geldi?
Ritwik Bose


3
oh ... bu 6 yıl önceydi ... Referans çerçeveme göre yeni değil: D
Ritwik Bose

2
Domuzcuklarla birlikteyim - altı yıl, neredeyse zamanın başlangıcından beri ortalarda olduğu anlamına geliyor.
James Moore

0

Kolon aslında ile birlikte var ?

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

eşdeğerdir:

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

Ayrıca her döngü için:

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

kelimenin tam anlamıyla:

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

0

iki nokta üst üste her döngü için kullanıyor, Bu örneği deneyin,

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);
                   }
       }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.