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]);
}
}
}
≪受付中のままにしないで、ちゃんと質問は締め切りましょう≫
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の中に入っていきます。
後はお好きなように取り出してください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
[Ljava.lang.Stringってなんですか
-
【C#】ハッシュテーブル(連想...
-
この警告はどうすれば?
-
main(String[] args) の args...
-
配列をセッションに割り当てた後で
-
sqlparamaterでIN句を使いたい。
-
Generics で型チェック
-
csvファイルを2次元配列に格納
-
javaについて
-
javaでEUC-JP文字列→UTF-8への変換
-
配列の中に複数存在する数がい...
-
Struts:可変個数のテキストボ...
-
Javaで文字と数字が混ざったも...
-
JAVAのNEW配列生成とガベージコ...
-
java
-
セッションを使ったint型の値の...
-
javaで大容量テキストファイル...
-
javaの乱数生成プログラム-バグ...
-
CSVファイルを二次元配列に格納...
-
キャストの仕方?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
配列で、値の入っている要素数...
-
【C#】ハッシュテーブル(連想...
-
[Ljava.lang.Stringってなんですか
-
javamailで複数人にメールを送...
-
この警告はどうすれば?
-
main(String[] args) の args...
-
javaで大容量テキストファイル...
-
Javaで文字と数字が混ざったも...
-
ページング
-
C言語でunsigned char配列を連...
-
Javaで文字を漢字であるか否か...
-
配列の中に複数存在する数がい...
-
C#で動的配列Listの中身をListB...
-
『args[]』とは?
-
同じ配列またはクラスを、2回...
-
java StringとString[]の違い
-
配列をセッションに割り当てた後で
-
【Ajax通信&Java】配列の受け取...
-
セッションを使ったint型の値の...
-
forループの評価(条件)式につ...
おすすめ情報