- PR -

Javaにて ORDER BYのアルゴリズム実現方法

1
投稿者投稿内容
n.w
大ベテラン
会議室デビュー日: 2003/07/15
投稿数: 126
お住まい・勤務地: 神奈川
投稿日時: 2005-11-29 19:54
お世話になっています、Javaにてソートを実現の為知恵を
貸していただけるとありがたいです。

まず行いたいこととしましては、SQLのORDER BYの機能になります。
コード:
col1   col2   col3 
  3     1      2
  3     2      2
  2     1      1
  1     1      1
  3     2      1


のような形のデータがあります(表イメージ)
このデータに対して優先度 col1、 col2、 col3
の順にて ORDER BY col1, col2, col3のようなソートをかけ

並びを
コード:
col1   col2   col3 
  1     1      1
  2     1      1
  3     1      2
  3     2      1
  3     2      2


と並べ替えたいと思っています。

ない知恵絞って考えた方法なんですが、
その1
1. col1列に対してソート処理
col1ソート後のデータをループでまわし、col2のi番目とi+1番目を比較し
一致している間一時格納用変数へ追加
以下の状態 1,2は重複ないためはぶく)
コード:
  3     1      2
  3     2      1
  3     2      2


2. 上記状態のデータい対しcol2の値にソート
1同様にcol3のi番目とi+1番目を比較し再びソートし
col1のデータ1と2のデータと連結し、ORDER BYちっくな処理を実現


その2
各データを文字列連結し以下のような状態に表す
312
322
211
111
321
今回の例で表すと3桁の数字にする
これに対し、ソートを行い
111
211
312
321
322
と並べ替える

と2つ思いついたのですがそれぞれ、懸念材料があります。

その1に対してはひたすらループをまわす為、レスポンスが大丈夫だろうかという点
その2に対しては(恥ずかしい話ですが)算数が得意ではないので、なんらかのレアケースが
発生しそう。

長々と書いてしまいましたが、指摘や、またほかのアルゴリズム、参考サイトありましたら
ご教授ください。 また、JavaのAPIを駆使して作る方法などないでしょうか?
や、ORDER BY 自体はどのようなアルゴリズムになっているのだろうなど
作っていて気になる点がふえてしまいましたが・・・

Googleにて漁ってはみたのですが、このような処理やアルゴリズムを発見することが
できませんでした。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2005-11-29 20:01
よくわからないのですが、データベース内のデータをソートしたいのではないのですよね?
だとすると、col1、col2、col3というのはどのようなデータなのですか? Javaでソートと
いうとCollections#sortでやるのが一般的ですが、それではできないことですか?
n.w
大ベテラン
会議室デビュー日: 2003/07/15
投稿数: 126
お住まい・勤務地: 神奈川
投稿日時: 2005-11-29 20:12
説明足らずで申し訳ありません。

データ事態は画面から渡されるもので、そのデータは固定長文字列になります。
バイト配列に変換後必要な項目を位置を指定して抜き出す形になっております。
(文字列、Stringにて保持)になります。


簡略化の為省いてしまったのですが、先ほど示したソートキーとは別に
値をもっています。 (col4 = データ1、col5 = データ2 などがあるイメージ)

コード:

col1 col2 col3 col4 col5
1 1 1 hoge1 2001
2 1 1 hoge2 2003
3 1 2 hoge3 2003
3 2 1 hoge4 2001
3 2 2 hoge4 2003


のような表をイメージしていただき、col1〜3を使い 列単位で
並べ替えたいと考えています。

※ SVFの帳票にて出力する際のソートになります。
Collectionクラスは検索時発見していたのですが、今回の
ように3つのソートキーでは実現できない(?)のかと
思って候補にいれませんでした。

Javadocを見た限り実装方法が見えないのですが
Comparator インターフェースを使い実現するのでしょうか?



JDK1.4.2_08
eclipse 3.0
Tomcat5.0
SVF


[ メッセージ編集済み 編集者: n.w 編集日時 2005-11-29 20:20 ]
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-11-29 20:20
値を表現するクラスを作成して、java.lang.Comparableを実装し、
java.util.Collections#sortでソートするのがよさそうですね。

コード:
class Value implements Comparable,Serializable{
    private int col1;
    private int col2;
    private int col3;
    private String col4;
    private String col5;
    ..それぞれのフィールドのsetter/getterメソッド

    //チェック等は省略
    public int compareTo(Object obj){
        Value v = (Value) obj;
        int diff;
        diff = this.col1 - obj.col1;
        if(diff <> 0){
            return diff;
        }
        diff = this.col2 - obj.col2;
        if(diff <> 0){
            return diff;
        }
        return this.col3 - obj.col3;
    }
}


こんな感じで実現可能かと思います。

詳しくはAPIドキュメントを参考にしてみてください。
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2005-11-29 20:32
適切なComparatorを実装してCollections#sort()ですね。

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


public class SortTest {
	
	public static void main(String args[])throws Exception{

		String[][] values = {
				{"3","1","1","4","AAA"},
				{"1","1","3","1","BBB"},
				{"2","1","3","1","CCC"},
				{"1","2","1","1","DDD"},
				{"3","1","1","1","EEE"},
		};

		List list = new ArrayList(Arrays.asList(values));
		
		Collections.sort(list,new Comparator(){
			public int compare(Object lhs, Object rhs) {
				String[] lstr = (String[])lhs;
				String[] rstr = (String[])rhs;
				
				for(int i = 0 ; i < lstr.length; i++){
					int result = lstr[i].compareTo(rstr[i]);
					if(result != 0)return result;
				}
				
				return 0;
			}
		});
		
		for(Iterator iter = list.iterator();iter.hasNext(){
			System.out.println(
					new ArrayList(Arrays.asList((String[])iter.next())));
		}
		
	}

}



実行結果
[1, 1, 3, 1, BBB]
[1, 2, 1, 1, DDD]
[2, 1, 3, 1, CCC]
[3, 1, 1, 1, EEE]
[3, 1, 1, 4, AAA]
n.w
大ベテラン
会議室デビュー日: 2003/07/15
投稿数: 126
お住まい・勤務地: 神奈川
投稿日時: 2005-11-30 11:15
シュンさん、かつのりさん大変勉強になりました!
教えていただいた方法で無事作成できました。
以下メソッドにしてみました。
また、0番目、4番目、7番目をキーにしてソートするように判定を追加

コード:
public static ArrayList sort(String[][] values){

    List list = new ArrayList(Arrays.asList(values));
    Collections.sort(list, new Comparator(){
		
        public int compare(Object lhs, Object rhs) {
    	    String[] lstr = (String[]) lhs;
	    String[] rstr = (String[]) rhs;
	    for(int i = 0 ; i < lstr.length; i++){
                if(i==0 || i==4 || i==7){
	          int result = lstr[i].compareTo(rstr[i]);
	          if(result != 0) return result;
	       }
	    }
	    return 0;
        }
    });
    ArrayList aray = new ArrayList();
    for(Iterator iter = list.iterator(); iter.hasNext(); ){
        aray.add(new ArrayList(Arrays.asList((String[]) iter.next())));
    }
    return aray;
}

1

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