2013-08-04 1 views
5

我々は2つの変数をforループ(for(i = 0, j = 0; i<30; i++,j++))の古いを使用することができます 我々はのために、各ループを使用(または拡張forループ)できるJavaで(二つの変数を持つfor(Item item : items)の?そのための構文は何でしょうか。Javaの新しいforループを2つの変数で使用できますか?

+4

を、それは基本的にforeachループです。できません。 – MightyPork

+1

@MightyPorkループ*用に強化されました。 –

+0

名前はどのように変更されて目的と用途が変わりますか?これはforeachループと同じです。 – MightyPork

答えて

7

は残念ながら、Javaは唯一の初歩的なのforeachループをサポートし、ループのための強化と呼ばれます。他の言語、Scalaのような特にFPのものは、道に沿って要素のフィルタリングと同様に、ネストされた反復を可能にリスト内包(Scalaはそれ理解ためを呼び出す)として知られている構文をサポートしています。

9

ありませんあなたがすることはできません。それはIteratorを使用するための構文糖である。この問題に良い答えをhereを参照してください。

あなたは両方の変数を含むオブジェクトを持っている必要があります。

それは、Mapオブジェクトの上に表示することができます例えば。

for (Map.Entry<String,String> e: map.entrySet()) { 
    // you can use e.getKey() and e.getValue() here 
} 
+0

'Map'は' Iterable'を実装していません。 – BalusC

+0

本当にありがとう!私の例を修正しました – Tala

+0

entrysetはそうです。 – arynaq

1

foreachループは、物事の一つだけのコレクションがあることを前提としています。反復ごとに各要素に対して何かを行うことができます。一度に2つのコレクションを繰り返すことができるなら、それをどのように動作させたいでしょうか?もし彼らの長さが違うなら?

あなたは

Collection<T1> collection1; 
Collection<T2> collection2; 

を持っていると仮定すると、あなたは両方を反復がマージされた結果のいくつかの並べ替えを返す反復可能ラッパーを書くことができます。私は考えることができるが、私はそれのために多くの使用を参照していないものに最も近いです

for(TwoThings<T1, T2> thing : new TwoCollectionWrapper(collection1, collection2) { 
    // one of them could be null if collections have different length 
    T1 t1 = thing.getFirst(); 
    T2 t2 = thing.getSecond(); 
} 

。両方のコレクションが一緒に繰り返される場合は、最初にCollection<TwoThings>を作成する方が簡単です。

あなたも順次反復処理したいことができ、並列に反復処理に加えて。そのための実装があります。グアバのIterables.concat()

1

単純な答え「いいえ」をすでに与えられています。しかし、2つのイテレータを引数として実装し、2つのイテレータから来る要素のペアを返すように実装できます。ペアは2つのフィールドを持つクラスです。あなたはそれを自分で実装しなければならないか、あるいはおそらくいくつかのApacheコモンズまたは同様のlibに存在するでしょう。

この新しいイテレータは、foreachループで使用することができます。

2

次はあなたが達成しようとしている同じ(パフォーマンス)効果持っている必要があります:それはloop`ための `新しいものではないのです

List<Item> aItems = new List<Item>(); 
List<Item> bItems = new List<Item>(); 
... 
Iterator aIterator = aItems.iterator(); 
Iterator bIterator = bItems.iterator(); 
while (aIterator.hasNext() && bIterator.hasNext()) { 
    Item aItem = aIterator.next(); 
    Item bItem = bIterator.next(); 
} 
関連する問題