1. ホーム
  2. java

[解決済み] 変数が解決できない

2022-02-12 12:07:38

質問

iとjの変数ごとに異なるアイテムリストを作成しようとしています。私のコードは次のとおりです。

if (i == 0) { 
            if (j == 0) { 
                final CharSequence[] items = {"4:45", "5:00"}
            } else if (j == 1) { 
                final CharSequence[] items = {"4:43", "4:58"}
            } else if (j == 2) { 
                final CharSequence[] items = {"4:41", "4:56"}
            } else { 
                final CharSequence[] items = {"4:38", "4:53"}
}

...

new AlertDialog.Builder(this)
               .setTitle("Hours")
               .setItems(items,
                new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialoginterface, int i) {
                      // getStation(i);
                   }
                })
               .show();
       }

の行でエラーが発生します。 .setItems(items, :

items cannot be resolved

とコンパイラは考えているのだと思います。 CharSequence[] items が初期化されていないとか...。 どうしたらこのプログラムを実行できるようになりますか?

解決方法は?

問題は変数のスコーピングです。

if (someCondition) {
   final int i = 666;
} else {
   final int i = 42;
}
int j = i + 1; // compile-time error

ここでは、2つのローカル変数 i を宣言し、初期化した直後にスコープ外に出てしまいます。もし j の値が必要です。 i であれば i は、より大きなスコープで宣言されなければならない。

final int i;
if (someCondition) {
   i = 666;
} else {
   i = 42;
}
int j = i + 1; // compiles fine!

(これはまさに三項演算子が得意とするシナリオであることを述べておく)

final int i = (someCondition) ? 666 : 42;


この場合、残念ながら、配列の初期化の省略記法は、宣言時にのみ使用することができます。つまり

int[] arr1 = { 1, 2, 3 }; // compiles fine!
int[] arr2;
arr2 = { 4, 5, 6 }; // doesn't compile!

の宣言を抜き出すことができます。 items の外側で if を作成し、その都度冗長なコードを書いていますが(Joachim Sauerの回答参照)、より簡潔なコードとしては、代わりにarray-of-arraysを使用することです。

final CharSequence[][] allItems = {
   { "4:45", "5:00" },
   { "4:43", "4:58" },
   { "4:41", "4:56" },
   { "4:38", "4:53" }
};
final CharSequence[] items = allItems[j];

この場合、このテクニックはうまく機能しますが、より一般的なケースで使用したいのは Map などがあります。

注:元のコードでは明示されていませんが、これは以下の場合に動作します。 j はどちらか 0 , 1 , 2 または 3 . 最後のオプションは j 以外の値である場合 0 , 1 , 2 に設定すると、それをチェックして 3 このコードの前に