11

for ループ内の配列が最後のインデックスに到達した後、インデックスが範囲外であるという例外が発生します。z私が望んでいたのは、が に等しくなるまで最初のインデックスに戻ることctrです。どうやってやるの?

私のコード:

char res;
int ctr = 10
char[] flames = {'F','L','A','M','E','S'};

for(int z = 0; z < ctr-1; z++){
    res = (flames[z]);
    jLabel1.setText(String.valueOf(res));
}
4

5 に答える 5

7

配列のサイズに制限されたインデックスを使用する必要があります。より正確に、難解に言えば、for ループの反復 {0..9} をフレーム配列 {0.. flames.length()-1} の有効なインデックスにマッピングする必要があります。この場合、これらは {0.. 5}。

ループが 0 から 5 まで繰り返される場合、マッピングは自明です。ループが 6 回繰り返される場合は、配列インデックス 0 にマップし直す必要があり、7 回目に反復する場合は配列インデックス 1 にマップする必要があります。

== 素朴な方法 ==

for(int z = 0, j = 0; z < ctr-1; z++, j++)
{
      if ( j >= flames.length() )
      {
         j = 0; // reset back to the beginning
      }
      res = (flames[j]);
      jLabel1.setText(String.valueOf(res));
}

== より適切な方法 ==

flames.length()次に、 for ループの外に移動する不変条件を実現することで、これを改善できます。

final int n = flames.length();
for(int z = 0, j = 0; z < ctr-1; z++, j++)
{
      if ( j >= n )
      {
         j = 0; // reset back to the beginning
      }
      res = (flames[j]);
      jLabel1.setText(String.valueOf(res));
}

== やり方 ==

さて、注意を払っていれば、インデックスに対して剰余算術を実行しているだけであることがわかります。したがって、モジュラー (%) 演算子を使用すると、コードを簡素化できます。

final int n = flames.length();
for(int z = 0; z < ctr-1; z++)
{
      res = (flames[z % n]);
      jLabel1.setText(String.valueOf(res));
}

このような問題に取り組むときは、Domain (この場合はループ反復用) から Range (有効な配列インデックス) への関数のマッピングについて考えてください。

さらに重要なことは、コーディングを開始する前に、紙の上で作業することです。それは、これらのタイプの基本的な問題を解決するための長い道のりです.

于 2013-09-10T18:04:12.540 に答える
5

有効なインデックスを作成するために%、インデックスを強制的にその範囲内にとどめるために使用する必要がありますflames.length

int len = flames.length;
for(int z = 0; z < ctr-1; z++){
      res = (flames[z % len]);
      jLabel1.setText(String.valueOf(res));
}
于 2013-09-10T17:37:58.220 に答える
2

次のことを試すことができます:-

char res;
int ctr = 10
char[] flames = {'F','L','A','M','E','S'};
int n = flames.length();
for(int z = 0; z < ctr-1; z++){
    res = flames[z %n];
    jLabel1.setText(String.valueOf(res));
}
于 2013-09-10T17:37:58.513 に答える
1

これを行う方法は次のとおりです。

String flames = "FLAMES";
int ctr = 10;

textLoop(flames.toCharArray(), jLabel1, ctr);

textLoop メソッド:

void textLoop(Iterable<Character> text, JLabel jLabel, int count){
    int idx = 0;
    while(true)
        for(char ch: text){
            jLabel.setText(String.valueOf(ch));
            if(++idx < count) return;
        }
}

EDIT:コードにバグが見つかりました(idxループ外で初期化する必要がありました)。これで修正されました。また、別の関数にリファクタリングしました。

于 2013-09-10T20:13:45.237 に答える