Blog7 of GrrrNeko BASE

このコーナーではデベロッパー向けに、私がハマってしまったポイントとその解決法を書いていきます。

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 までなのよね。

ページトップへ