- PR -

配列の重複要素を取り除く方法

1
投稿者投稿内容
hakotaro
会議室デビュー日: 2004/09/26
投稿数: 3
投稿日時: 2004-09-26 13:52
配列を重複要素を取り除く方法がわかりません.
たとえばすべて数字の要素{1,-1,2,0,2,1,3,0,1,5}という配列があったとして
これを0以下の数と重複する要素を取り除いた要素{1,2,3,5}にしたいのですが
よくわかりません.最小の数字を固定して比較していくのかと思っていたのですが
できません.初心者なもので,どなたかアドバイスをいただけるとありがたいです.
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2004-09-26 14:11
hakotaroさん、こんにちわ

配列の代わりに java.util.Set (たとえば、java.util.HashSet)を
使用してはどうでしょうか。

intや doubleのようなプリミティブな型は Integer, Doubleクラス
のオブジェクトにすれば格納できます。
hakotaro
会議室デビュー日: 2004/09/26
投稿数: 3
投稿日時: 2004-09-26 14:43

返答ありがとうございます.
{1,2,3,5}にした後,この配列を使って計算したいので
何とか配列でできるいい方法は無いものでしょうか?
便利なツールがあるとのことですがオブジェクトではなく
この操作をひとつのメソッドとして
作りたいんです.何かいい方法は無いでしょうか?
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2004-09-26 15:52
hakotaroさんが欲しい物かどうかわかりませんが、
次のようなメソッドを呼び出せばどうでしょう。

コード:
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;

// あなたのクラスの中
public int[] normalize(int[] data) {
	Set set = new TreeSet();
	for (int i = 0; i < data.length; ++i)
		if (data[i] > 0)
			set.add(new Integer(data[i]));

	int[] normalizedData = new int[set.size()];
	Iterator iterator = set.iterator();
	int i = 0;
	while (iterator.hasNext())
		normalizedData[i++] =
			((Integer)iterator.next()).intValue();

	return normalizedData;
}



配列のまま処理するより面倒に見えますが、
後々いいことがあるでしょう。

なお、この例ではソートするために TreeSet を使用して
いますが、ソートする必要が無い場合は HashSetの方が
処理が速いかも知れません。
hakotaro
会議室デビュー日: 2004/09/26
投稿数: 3
投稿日時: 2004-09-26 17:12
使い方はわかりました.
ですが,{1,2,1,-1,0,1,3,5}を抜き出した順に
並べたいのですが,どうすればよいでしょうか?

要は{1,2,3,5}を
for(i=0;, i < data.length; i++){
out.println("data[" + i +"] = " + data[i]);
}
として
data[0] = 1
data[1] = 2
data[2] = 3
data[3] = 5
のようにして表示したいのですが.
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2004-09-26 17:37
抜き出した順でしたか、失礼いたしました。

Setの代わりにリスト使ってみました。

コード:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

// 途中省略
public static int[] normalize(int[] data) {
	List list = new ArrayList();
	for (int i = 0; i < data.length; ++i)
		if (data[i] > 0) {
			Object object = new Integer(data[i]);
			if (!list.contains(object))
				list.add(object);
		}

	int[] normalizedData = new int[list.size()];
	Iterator iterator = list.iterator();
	int i = 0;
	while (iterator.hasNext())
		normalizedData[i++] =
			((Integer)iterator.next()).intValue();

	return normalizedData;
}



説明の必要は無いかもしれませんが、原理はつぎのとおりです。
・可変長の配列 ArrayListを作る。
・元データが、0以下でないとき、
 ・ArrayListに格納できるように、データを Integerでラップする。
 ・可変配列の中に同じ値が無ければ、
  ・データを追加する。
・確定したデータ数分の int配列を生成し、
・1つずつ Integerのラップを外して int配列に格納
さくらば
大ベテラン
会議室デビュー日: 2002/11/12
投稿数: 145
投稿日時: 2004-09-27 14:05
こんにちは、さくらばです。

引用:

Kissingerさんの書き込み (2004-09-26 17:37) より:
抜き出した順でしたか、失礼いたしました。

Setの代わりにリスト使ってみました。



LinkedHashSet を使えばいいのではないでしょうか。
これだと抜き出し順に取り出せますが。
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2004-09-28 00:40
さくらばさん、こんにちは。
そうでした。忘れてました。
1

スキルアップ/キャリアアップ(JOB@IT)