コロン(:)演算子は何をしますか?


91

どうやら、コロンはJavaで複数の方法で使用されています。誰かがそれが何をするのか説明してもらえますか?

たとえばここで:

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

for-each組み込まないように、このループを別の方法でどのように記述します:か?


4
他の人は、そのようなケースがfor-eachループであるとすでに述べています。動作の詳細については、java.sun.com
j2se /

回答:


195

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)三元条件(チュートリアル):

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

3)For-eachループ(チュートリアル):

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ステートメントの場合(チュートリアル):

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 2010年

.NET(C#)から来ると、問題の構造に最も近いアナロジーはfor-eachであり、これはあなたが良い方法で説明しました。
ロジャー

2
失敗assertしても「プログラムを終了」しません。をスローしAssertionErrorます。残っている唯一の非デーモンスレッドのスタックにスローされ、キャッチされない場合にのみ、プログラムが終了します。
スティーブンC

すべてを含めることを目的とする場合は、二重コロン(::)演算子を追加します
kiedysktos 2015年

1
また、メソッド参照では二重コロンが使用されます。
ダニエルM.

34

「コロン」演算子はありませんが、コロンは2つの場所に表示されます。

1:三項演算子で、例:

int x = bigInt ? 10000 : 50;

この場合、三項演算子は式の「if」として機能します。bigIntがtrueの場合、xには10000が割り当てられます。そうでない場合、50。ここでのコロンは「else」を意味します。

2:for-eachループ内:

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、2番目の反復で20.3などになります。

注:これは単なる構文であるため、演算子ではないと言います。与えられた式にそれ自体で現れることはできず、for-each演算子と三項演算子の両方がコロンを使用する可能性があります。


後半は助けになりました、これが本当の答えになるはずです
erp 2014

for-eachループで何をしているのかをより詳細に説明するには+1。
dfarrell07 2014

18

さらに、for-eachループで使用する場合、「:」は基本的に「in」と読み取ることができます。

そう

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

「名前ごとにIN名は...」と読む必要があります。


15

「:」を組み込まないように、このfor-eachループを異なる方法でどのように記述しますか?

それlistCollectionインスタンスであると仮定すると...

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

:このコンテキストでは、演算子ではないペダンティックポイントを追加する必要があります。JLSによると、演算子は式で演算を実行( ... )し、forステートメント内の内容は式ではありません...。


私の質問は:なぜですか?なぜ長い道のりで同じことをするのですか?
richN 2010年

2
@ RichN-彼はそれをしたくありません、彼はただ方法を知りたいだけです。
スティーブンC

3
宿題ではなく、論理を理解できるように、長い道のりでそれを行う方法を知りたい
レモン

実際、私の(悪い)大学では、コンピューターエンジニアリングの研究中に、Javaコースの(:)について何も教えてくれませんでした。後で例を見て学ぶようになりましたが、残念ながら、今ではコーディングするのが難しいです。大学ですべてのプロジェクトを長い道のりで行ったので、頭に浮かびました
カルロスサンチェス

それlistCollection;のインスタンスであると想定する必要はありません。これIterableは、拡張forループで使用できるかどうかのインスタンスである必要があります。つまりiterator()、回答で呼び出すメソッドが含まれます。
Kröw

1

これは、オブジェクトのリストを反復処理するためにforループで使用されます。

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

通常、これは3値代入演算子で表示されます。

構文

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

例:

boolean isNegative = number > 0 ? false : true;

これは本質的にifelseと「同等」です

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

さまざまなポスターによる例を除いて、

:を使用して、continueおよびbreakと組み合わせて使用​​できるブロックのラベルを示すこともできます。

例えば:

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 2010年

@ user44242lolはいなぜ私がその例を挙げたのかさえ覚えていません。
ultrajohn 2015

1
@ user44242そのような例を示すと、単純になり、条件演算子がどのように機能するかがわかりやすくなります。「ブールisNegative = number> 0;と書いてみませんか。」それは三項演算子について何も示していないからです。
Kröw

1

文字列「something」を3回出力します。

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

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

 panel.add(label);             
 }

1
これは、ForEachループとして上記で述べたものです
P.JAYASRI 2015年

1

ほとんどのforループは非常に似ているため、Javaには、foreachループと呼ばれるループの記述に必要なコードの量を減らすためのショートカットが用意されています。

各ループの簡潔な例を次に示します。

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

上記の例では、コロン(:)は「in」と読み取ることができます。for eachループは、「quizGradesの各整数要素(gradeと呼ばれる)について、gradeの値を出力する」と読むことができます。


0

これは、新しい短縮形for / loopで使用されます

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

および三項演算子

list.isEmpty() ? true : false;

そんなに新しいことに気づかなかった…いつ入ったの?
Ritwik Bose 2010


3
ああ...それは6年前のことです...私の基準では新しいものではありません:D
Ritwik Bose 2010

2
私は豚と一緒にいます-6年は、それが事実上時間の夜明けから存在していることを意味します。
ジェームズムーア

0

コロンは実際には ?

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

と同等です:

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

for eachループでも:

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

文字通り:

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

0

コロンはfor-eachループで使用しています。この例を試してください。

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.