something which something is something

まとまりのないブログ

jsp

Javaによるデータのソート方法についての考え - 異なるデータ形式を一つのものとしてソートする場合

投稿日:

データ形式が違う2つのものを合体させてからソートをするというような時,どういう方法があり得るかというのをなんとなく考えてみた。例えば,xml形式のデータと,sql発行の結果データなど,違う形式のデータを扱う場合。
プログラミング言語はなんだって構わないんだけれど,とりあえずJavaではどうなるかというのを考えてみる。

すぐに思いついた方法は2つ。

  • xmlデータを作成してxsltにてソートする方法
  • 配列にてデータを格納してからソートを行う方法

他にも簡単に出来る方法があるかもしれないが,私が考えて思い浮かんだのは上記二つ。resultsetオブジェクトを作成することでなにかソートする方法がないかとも模索してみたが,有効な可能性がある方法は見つからなかった。

今のところ私が実際にやろうと思っているのは配列にデータを格納してからソートを行うと言う方法。xmlデータを作成してxsltでソートというのはちょっと考えただけでも手間がかかりそうなので最後の手段にとっておく。ちなみにxmlデータでのソートを実現するまでの手順のイメージとしては,

  1. xmlデータを読み込んで所定の形式のxmlオブジェクトを作成する(仮にA-1と名づける)
  2. sql発行後の結果のデータから所定の形式のxmlオブジェクトを作成する(仮にA-2と名づける)
  3. A-1とA-2のxmlオブジェクトをマージして一つのxmlオブジェクトとする。(仮にA-3と名づける)
  4. ソートする条件を記述したxsltファイルを作成し,A-3へ適用して整形する。(仮にA-3'と名づける)
  5. 出来上がったxmlオブジェクトA-3'を使ってデータを本来の目的へと使う。

・・・というようなイメージというか妄想を考えていたのだけれど,実際にやってみたわけではないので上手くいくかどうかわからないし,何より手間がかかり過ぎる。なので,配列にデータを格納してソートをするという方法でやってみることを検討する。配列にデータを格納してソートするという方法の手順のイメージとしては,

  1. xmlデータを読み込んで配列オブジェクトへデータを格納する。(仮にA-1と名づける)
  2. sql発行後の結果データを配列オブジェクトA-1へ追加格納する。
  3. 配列オブジェクトA-1を条件を指定してソートする。(仮にA-1'と名づける)
  4. 出来上がったA-1'を使ってデータを本来の目的へと使う。

・・・というようなイメージを考えている。データ形式の違うデータ2つを合体させてソートということになると,こういう方法ぐらいしか私には思い浮かばない・・・。xmlオブジェクトでソートする場合ならxsltでソート条件を指定することができるようだが,配列オブジェクトの場合はデータを一つずつ比較してソートをする必要があるので,指定した条件でソートするとなると多重配列で配列オブジェクトを作成する必要がある。

多重配列でソートする実装例

実装例を追記しようと思ったが,諸事情があって必要がなくなってしまったので,調べたところまでの概略をメモするに留める。

多重配列とは?

配列が多重になった配列,それが多重配列。配列で配列を構成したもの。配列を配列で構成したものを仮に2次元という意味で2次配列と定義してみると,配列を配列の配列で構成した3次配列やそれをさらに配列にした4次配列というものも実現することができる。データとして扱うには配列の要素にアクセスするのは深くなるほど複雑になるので,現実的には2次配列,またはせいぜい3次配列を使う。

ここでは2次配列を使ってみることにする。私個人のイメージとしては,多重配列はエクセルなどのスプレッドシートにデータがあるようなイメージを勝手に思い浮かべているが,まあそれは私だけかもしれないのでどうでもいい。

実装例

多重配列(JavaでいうところのArrayList)の要素をソートする手順は,多重配列オブジェクトを作成して,配列内の要素でソートしたいものを選択してからソートをするというイメージ。サンプルとして下記のクラスを作成してみた。やっていることはcomparetoメソッドを使って比較をしているだけ。下記のクラスの場合は文字列を比較して昇順にソートする場合の例。数値を比較したり日付を比較したりする場合も下記を応用してみることで,まあ,一応実装することはできると思われる。

package cdn;

import java.util.ArrayList;
import java.util.Comparator;

public class ListCompare  implements Comparator{

	public int compare(Object o1, Object o2) {
		int returnVaule = 0;
		returnVaule = compare((ArrayList)o1, (ArrayList)o2);
		return returnVaule;
	}

	public int compare(ArrayList array1, ArrayList array2) {
		int returnVaule = 0;
		returnVaule = array1.get(4).toString().compareTo(array2.get(4).toString());
		return returnVaule;
	}
}

上記のクラスを使うときは下記のように呼び出すことになる。

	ArrayList al getList(kyword);
	List list = al
	Collections.sort(list,new ListCompare());

もう少し解説をすると,上記の多重配列のソート条件は,配列の5番目の要素(String)を指定してソートをしているということになる。一応動作テストをしてはみたものの,ソートはできているような気配はしているが,私自身に実装する必要がなくなってしまったので厳密には確認できていない。Comparator,java,sort,ソートといったキーワードでgoogle検索をするとさらに詳しい情報が得られると思うので,知りたい人はそちらを調査してもらいたい

その他

何故このような違う形式のデータを合体させるようなことを考えているかと言うと,Webサービスとして公開されているapiで取得できるデータを自前のデータと組み合わせて一括で表示してみると面白いんじゃないかと思っていたから。ただ,それには技術的な問題もある。例えば,apiであるキーワードに該当するデータと自前のDBにあるデータからあるキーワードで検索したデータを一括する場合。細かい話だが,1~20件,21件~40件,41件~60件…といったようなページ表示をさせるシステムにする場合,apiのデータと自前のデータを単純に合体させての表示ではページ操作の部分で上手く実装するには多少の手間がかかりそうな予感がする・・・。apiでキーワードに該当するデータを1~20件取得して,DBからキーワードに該当するデータを1~20件取得して,それを合体させてソートする。1ページ目だけの表示ならばそれでいいが,2ページ目以降のデータ表示で正しい結果を表示させるとなると,ちょっとすぐにはいいアイデアが思いつかない。力技でマシンスペックを消耗させる手段をとるしかないんだろうか。

以上のようなことをぼんやりと考えていたのだけれど,結局はその機能は実装しないことにした。Yahoo!や楽天,amazon,価格.com,その他ASPなどが多くのapiを公開していて情報量はかなりのものになる。それらの膨大な情報をまとめて一つのデータとして利用することができれば,総合的な検索サービスのようなものを作り上げることができそうであると思ったが,さほどの魅力を見出せなかった。というか,そういうサービスを提供しているサイトは既にいくつか存在している。そして試しにそのいろいろなサイトのサービスを利用してみたところ,悲しいかな同じデータ元からデータを引っ張ってきているのでほぼ同じ結果が表示されるだけだった。ウェブデザインだけが変わった他のサイトと同じ情報のサービスを新たに作るのは意義が乏しい。apiで取得できるデータを加工して,いかに有用なサービスを作り出すかというのはクリエイタの腕の見せ所ではあるのであるけれど,頭の中で思い浮かべるだけでなく実際に動くものとして作って見せるのは実に難しい・・・。

-jsp

Copyright© まとまりのないブログ , 2019 All Rights Reserved Powered by STINGER.