プロが教えるわが家の防犯対策術!

javaを勉強していて、考えると頭がこんがらがってしまったので
質問します。アドバイスお願いします。

今、例えば
配列にstr[0]に"本"、str[1]に"部品"、str[2]に"本"、str[3]に"部品"、str[4]に"交換"
という文字列が格納されているとして、
新しく作った配列str2に配列strでかぶっている文字列を取り除いて
格納するにはどのようにすればよいのでしょうか?
str2[0]に"本"、str2[1]に"部品"、str2[2]に"交換"という風に格納したいです。

使えるメソッドなどありましたら教えてください。
よろしくお願いします。

A 回答 (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]);
    }
  }
}

≪受付中のままにしないで、ちゃんと質問は締め切りましょう≫
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/11/19 17:44

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の中に入っていきます。
後はお好きなように取り出してください。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/11/19 17:46

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!