Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

いらない配列をつめる

tという配列がありまして、tのなかに同じ文字列があればカウント1を増やし、その文字列を消去し、配列をつめるプログラムを作りました。だいたいつめることができましたが、一部同じ文字列が存在していることがあります。なにかまずい点はありますか?教えてください。
        
        int count=1;
        int ii=0;
        int j=1;
        int jj=0;
        int s;
        int iii;
        
        ・
        <中略>
        ・

while(t[ii]!=null){
             
     iii=ii;
     
                    while(t[iii+j]!=null){        
                              if (t[iii].equals(t[iii+j])) {  //次の配列と同じなら
                                        count++;
                                            for(s=1;s<=k+1-iii-j;s++){
                            t[iii+j+jj]=t[iii+j+jj+1]; //配列をつめる
                                    jj++;
                                    } jj=0;
                            
                            }
                            
                            
                    j++;} j=1;
                
     pw.write(t[ii]+","+count + "\n");
     ii++;
     count=1;
     }            
     pw.close(); 
    
    }catch( IOException exp ) {
System.out.println( "入出力エラーです。" );

kは配列の数です。t[3]ならk=4です。

3

回答

6822

閲覧

3件の回答

評価

0

Collection使えば。
あと、もう少し人間が読みやすいプログラムを書いたほうがいいよ。

評価

0

はじめまして。

とりあえず、カウンタはもうちょっとわかりやすくしたほうが良いかと。
i,j,k,cがループのカウンタ変数の定番ですね。
また、sは文字列に良く使われます。

また、この手のループはfor(){〜}の方がいいと思います。
null比較をwhileの実行条件にしているとカウンタが増えすぎてエラー、となりかねませんし。

当方、下記ソースでは
java.lang.ArrayIndexOutOfBoundsException
でました(^^;

評価

0

forにするなら、カウンタはfor(int i=…のように、中で宣言してください。
変数は、for文でもなんでも、その使用範囲を明確にすることも重要です。

もうひとつ、close()はfinally節で行ってください。
途中でexceptionが発生した場合、close()が行われないかも知れません。

処理を実現するひとつの案としては、
1. 配列を頭からループして、キー:要素でmapをtrueにしていく。
2. すでにtrueであれば、カウンタをインクリメントして値をnullにする
3. 再度配列をループして、値がnullのものを詰めていく

でしょうかね。
こういうものは、全部いっぺんにやろうとすると混乱します。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。