• ベストアンサー

javaプログラミングでのかぶった文字列の除去

javaを勉強していて、考えると頭がこんがらがってしまったので 質問します。アドバイスお願いします。 今、例えば 配列にstr[0]に"本"、str[1]に"部品"、str[2]に"本"、str[3]に"部品"、str[4]に"交換" という文字列が格納されているとして、 新しく作った配列str2に配列strでかぶっている文字列を取り除いて 格納するにはどのようにすればよいのでしょうか? str2[0]に"本"、str2[1]に"部品"、str2[2]に"交換"という風に格納したいです。 使えるメソッドなどありましたら教えてください。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

>使えるメソッドなどありましたら教えてください。 javaで基本型の配列を使ってしまうと、重複を排除してくれるような便利なメソッドは使えません。 というか、クラスArraysでも、mergeの処理メソッドは存在しません。(J2SE1.4.0) 従って、ロジックで処理するしかありません。 手順としては、 1)元の配列を作業用にコピーする。(原本を壊して構わないならコピーしなくても可) 2)配列に有効要素が入っている数を管理する変数を設ける。 3)二重ループを構成して、配列内の第一要素から、それ以降に重複要素がないかを調べる。   あったら、重複要素の一つ後から末端までを一つ手前に移動するようにコピーする。   (このコピーにはjava.lang.System.arraycopyメソッドを用いる) 4)手前に移動する事で、末端の要素が無意味になるので、""(空文字列)で埋める。   同時に、配列の要素数の管理変数を一減算する。 5)管理変数から有効要素数がわかるので、新しい配列を生成し、そこに要素数分のコピーする。 試みに書いたのは以下の形です。 ------------- merge.java ------------------------- import java.lang.*; public class merge{   public static void main(String args[]) {     int Sindex,Dindex,Smax,Dmax;     final     String[] str = { "本", "部品", "本", "部品", "交換", };     String[] strw= new String[5];     String[] str2;     System.arraycopy(str,0,strw,0,str.length); // 作業用配列作成 1)     System.out.println("---旧配列---"); // (内容確認)     for(Sindex=0;Sindex<strw.length;Sindex++) {       System.out.println(strw[Sindex]);     }     Smax=Dmax=strw.length; // 配列の要素数の管理変数初期化 2)     for(Sindex=0;Sindex<Smax;Sindex++) {       for(Dindex=Sindex+1;Dindex<Dmax;Dindex++) {         if(strw[Sindex].equals(strw[Dindex])==true) {           // 重複要素を潰して重複要素より後を前に一つ移動 3)           System.arraycopy(strw,Dindex+1,strw,Dindex,Dmax-(Dindex+1));           strw[Dmax-1]=""; // 終端の要素に空文字列を埋める 4)           Smax--;Dmax--; // 配列の管理変数を減算する         }       }     }     str2 = new String[Dmax]; // 重複のない要素数で新配列を生成 5)     System.arraycopy(strw,0,str2,0,Dmax); // 重複のない要素数分コピーする     System.out.println(""); // (内容確認)     System.out.println("---新配列---");     for(Sindex=0;Sindex<str2.length;Sindex++) {       System.out.println(str2[Sindex]);     }   } } ≪受付中のままにしないで、ちゃんと質問は締め切りましょう≫

kanari501
質問者

お礼

arraycopyがかなり便利ですね!アルゴリズムも非常に分かりやすく 理解できました。ありがとうございました★

その他の回答 (1)

回答No.1

ArrayListクラスを使うと楽にできると思います。 boolean add(Object o) リストの最後に、指定された要素を追加します。 boolean contains(Object elem) リストに指定の要素がある場合に true を返します。 というメソッドが用意されているので、 ArrayList al=new ArrayList(); for(int i=0;i<str.length;i++) { if(!al.contains(str[i])) { al.add(str[i]); } } とすると、かぶったものは除かれてArrayListの中に入っていきます。 後はお好きなように取り出してください。

kanari501
質問者

お礼

ArrayListクラスは便利ですが、配列str2に取り出すことが できませんでした。アドバイスありがとうございました!

関連するQ&A