いくつかのコンポーネントを持つ文字列配列がありますが、この配列には5つのコンポーネントがあり、時々異なります。私がやりたいのは、その配列を反復処理し、最初のコンポーネントとその隣のコンポーネントを取得することです。したがって、最初にコンポーネント番号1とコンポーネント番号2を取得し、2回目は番号2と3を取得し、3回目は番号3と4を取得します...など、最後のコンポーネントに到達するまで続きます。
これは私がどこまで来たか:
String[] elements = { "a", "a","a","a" };
for( int i = 0; i <= elements.length - 1; i++)
{
// get element number 0 and 1 and put it in a variable,
// and the next time get element 1 and 2 and put this in another variable.
}
どうすればこれを達成できますか?
配列の要素の反復に対して ループの拡張 (Java 5以上の場合)を実行できます。
String[] elements = {"a", "a", "a", "a"};
for (String s: elements) {
//Do your stuff here
System.out.println(s);
}
String[] elements = { "a", "a", "a", "a" };
for( int i = 0; i < elements.length - 1; i++)
{
String element = elements[i];
String nextElement = elements[i+1];
}
この場合、elements.length
は4なので、[0,2]
を反復処理して、要素0,1
、1,2
、および2,3
を取得することに注意してください。
String current = elements[i];
if (i != elements.length - 1) {
String next = elements[i+1];
}
これにより、最後の要素に対してArrayIndexOutOfBoundsException
を取得しないようにします(「次」はありません)。他のオプションは、i < elements.length - 1
を反復処理することです。要件によって異なります。
String[] elements = { "a", "a","a","a" };
for( int i=0; i<elements.length-1; i++)
{
String s1 = elements[i];
String s2 = elements[i+1];
}
elements.length - 1
未満のi
をテストする代わりに、i + 1
未満のelements.length
をテストすることを主張します。見ている配列のドメインを変更するのではなく(つまり、最後の要素を無視する)、各反復で見ている最大の要素を変更します。
String[] elements = { "a", "a","a","a" };
for(int i = 0; i + 1 < elements.length; i++) {
String first = elements[i];
String second = elements[i+1];
//do something with the two strings
}
アレイにアクセスする回数をシリアルに維持する必要があります。
int lookUpTime=0;
for(int i=lookUpTime;i<lookUpTime+2 && i<elements.length();i++)
{
// do something with elements[i]
}
lookUpTime++;
これらのアルゴリズムは、比較のために両方とも正しくありません。
for(int i = 0; i <elements.length-1; i ++)
または
for(int i = 0; i + 1 <elements.length; i ++){
配列要素の範囲が0
からlength - 1
であることは事実ですが、その場合の比較はless than or equal to
でなければなりません。それらは:
for(int i = 0; i <elements.length; i ++){
または
for(int i = 0; i <= elements.length-1; i ++){
または
for(int i = 0; i + 1 <= elements.length; i ++){
配列["a", "b"]
は次のように反復します。
i = 0は<2です:elements [0]は「a」を生成します
i = 1は<2です。elements[1]は「b」を生成します
2は2未満ではないため、ループを終了します。
誤った例は、ループを途中で終了し、この2つの要素の単純な場合の最初の要素でのみ実行されます。
String[] nameArray= {"John", "Paul", "Ringo", "George"};
int numberOfItems = nameArray.length;
for (int i=0; i<numberOfItems; i++)
{
String name = nameArray[i];
System.out.println("Hello " + name);
}
パフォーマンスを探していて、反復の順序が関係ない場合は、最適化された逆ループを使用して反復できます。
for(int i=elements.lenth; --i>=0;) {...}
このような方法で、配列の長さを1回取得してから、インデックスをデクリメントし、1つのアトミック操作でゼロと比較します。最後ではありませんが、ゼロと比較することは非常に高速な操作であり、多くのプロセッサによって最適化されることがよくあります(アレイの有効範囲と比較するよりも高速です)。