2012-9-25
android: 集合の要素かどうかを調べる
症状:
If文で論理和を使うには要素の数が多すぎる場合。
if(a == 0 || a == 5 || a == 8 || a == 12 || …) は不格好なだけでなく、繰り返しやらなければならなかったり、集合の要素が変化するときに困る。
解決法:
もっと洗練されたやり方があるかもしれないが、解決法の一つは集合だけに配列を使う。
例えば、集合(3、8、10、15)に、8と5が含まれるかどうかのテストを実行するコードは以下のようになる。textview1, textview2はxmlで指定されている。
TextView tv1 = (TextView) findViewById(R.id.textview1); TextView tv2 = (TextView) findViewById(R.id.textview2); int i = 0; int[] a = {3,8,10,15}; int b = 8; for (i=0; i<a.length; i++) { if (b == a[i]) { tv1.setText(b + " is a member."); break; } else if (i == a.length-1) { tv1.setText(b + " is NOT a member."); break; } } b = 5; for (i=0; i<a.length; i++) { if (b == a[i]) { tv2.setText(b + " is a member."); break; } else if (i == a.length-1) { tv2.setText(b + " is NOT a member."); break; } }
実行結果は、"8 is a member. 5 is NOT a member."となる。
上級者には何でもないことだろうけれど、ポイントが2つほど。
- 1. else if にせず、単に else にしてしまうと、最初の一つしか検証しない。
- 2. else if 文の条件、a.length -1 の -1 を付け忘れると、例えば i = 4 にはならないのでうまくいかない。
それじゃあといって for の上限を a.length +1 とかにすると、コンパイルは通るけれど実行されない。
∵(なぜならば)この例だったら ArrayIndexOutOfBoundException: length=4; index=4 のエラーが出てしまうから。
長さが 4 でインデックスが 4 って合ってるじゃん!って言ったところで、android って
index が 0 から始まるので、ドロイド君的には index は 3 までなのよね。