- PR -

Javaでのsort処理について

1
投稿者投稿内容
seki
常連さん
会議室デビュー日: 2005/03/23
投稿数: 29
投稿日時: 2005-04-14 18:04
Javaでのsort処理について教えて頂きたいことがあります。

Javaで提供されているクラスで、重複のキーを許すような配列
を格納出来るクラスなるものは存在するのでしょうか?

下記のような処理を行いたいと思っています。

@ Hashtableで、aHash_、bHash_を作成。
A aHash_には、キー=A、B、Cでデータを格納
B bHash_には、キー=A、Cでデータを格納

aHash_とbHash_でキーでマッチングさせて、データを合算して、
最終的にはcHash_でキーで昇順にデータを並べ変えたいのです。

プログラムではよくある処理と思うのですが、調べたところ、
MapやArraysでは上記の処理を効率良く処理できなそうです。

どなたかご存知の方がいらっしゃいましたら、ご教示お願い
致します。
_________________
YOU@IT
ぬし
会議室デビュー日: 2002/03/29
投稿数: 284
お住まい・勤務地: 大阪
投稿日時: 2005-04-14 18:41

Jakarta-Commons-Collections に、J2SEが標準で提供していないコレクション実装が
あるので、そこを調べられてはどうでしょう?
ちょっと見た感じでは、MultiMap等は使えるかもしれません。
(sekiさんの処理イメージとは若干異なりそうですが...)

あるいは、キーの重複を許すのではなく、複数の値を格納できるようにする方法もあると思います。
簡単な例で言えば
コード:
public static addTo(Map map, Object key, Object value) {
 if(map.containtsKey(key)) {
  ((List)map.get(key)).add(value);
 }
 else {
  List list = new ArrayList();
  list.add(value);
  map.put(key, list);
 ]
}


のような感じです。。。

ただ、個人的にはコレクションをネストする(上記のようにMapの中にListを入れる等)は
コードが煩雑なってあまり良くないかと思います。
より良い方法としては、複数の値を保持できるようなシンプルなオブジェクトを
作っても良いかもしれません。

seki
常連さん
会議室デビュー日: 2005/03/23
投稿数: 29
投稿日時: 2005-04-14 18:58
YOU@ITさん
アドバイスありがとうございます。

ファイルマッチング処理の1:N、N:Nのような事をJavaでやりたい
だけなのですが、どうもJavaは処理したいなぁ、と思うメソッド
などが用意されていなかったりして困っています。
(やはり自分で作らなければならないものなのでしょうか?
自分で作るとパフォーマンスが気になります。)

オブジェクト志向言語になじみが薄く、もう少し調べてみます。
ヒント等ありましたらお願い致します。
_________________
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2005-04-16 16:11
unibon です。こんにちわ。

私には、どういう並べ替えを要求されているのかがイマイチ良く見えません。
Java なら Comparable(か Comparator のどっちか)を implements すれば、sort の順序を自由に制御できるはずですが、要は Comparable の実装をどうしたら良いか、という話でしょうか?
http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/util/Arrays.html#sort(java.lang.Object[],%20java.util.Comparator)
だとしたら、クラスのフィールドになにがあって、それを使ってどういう順序を望まれているのかを、もう少し細かく提示されたほうが良いかもしれません。

引用:

sekiさんの書き込み (2005-04-14 18:04) より:
Javaで提供されているクラスで、重複のキーを許すような配列
を格納出来るクラスなるものは存在するのでしょうか?


配列やListなら重複はいくらでも許されます。Set だと、equals の実装で重複かどうかが決まりますが、これはソートのキーとは違わせるkとおもできます。もっとも、後述のように Set の要素をソートすることってあんまりやらないです。
引用:

sekiさんの書き込み (2005-04-14 18:04) より:
aHash_とbHash_でキーでマッチングさせて、データを合算して、
最終的にはcHash_でキーで昇順にデータを並べ変えたいのです。


Hashtable というのが良く分かりません。Hashtable だとすなわち Set なので、これだと順序を保持することは、あまりやりません(SortedSet とかはあるみたいですが)。
引用:

sekiさんの書き込み (2005-04-14 18:58) より:
ファイルマッチング処理の1:N、N:Nのような事をJavaでやりたい
だけなのですが、どうもJavaは処理したいなぁ、と思うメソッド
などが用意されていなかったりして困っています。


1:N や N:N が良く分かりません。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2005-04-16 17:44
unibon です。こんにちわ。
型が混在したソートということなら、つぎのような感じかもしれません。

コード:

import java.util.*;

public class SortTester {

private static class ClassA {
public String keyA;
public String keyB;
public String keyC;
}

private static class ClassB {
public String keyA;
public String keyC;
}

private static class ABComparator implements Comparator {

public int compare(Object x, Object y) {
int comp;
if (x instanceof ClassA && y instanceof ClassA) {
comp = ((ClassA) x) と ((ClassA) y) の比較;
} else if (x instanceof ClassA && y instanceof ClassB) {
comp = ((ClassA) x) と ((ClassB) y) の比較;
} else if (x instanceof ClassB && y instanceof ClassA) {
comp = ((ClassB) x) と ((ClassA) y) の比較;
} else if (x instanceof ClassB && y instanceof ClassB) {
comp = ((ClassB) x) と ((ClassB) y) の比較;
} else {
throw new RuntimeException();
}
return comp;
}
}

public static void main(String[] args) {
List list = new ArrayList();
Comparator comparator = new ABComparator();
Collections.sort(list, comparator);
}
}


ただ、Hashtable のような Map だと key と value を分けますが、Collections.sort の対象となるようなクラスだと key と value をひとつのクラスにまとめてしまうことが多いようです。このあたりはソートの本質ではありませんが、クラス設計の際はとまどいます。Comparable と Comparator の両方があるのと理屈は同じかもしれません。

[ メッセージ編集済み 編集者: unibon 編集日時 2005-04-16 17:45 ]
1

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