ウィリアムのいたずらの、まちあるき、たべあるきーPART2

gooブログ「ウィリアムのいたずらの、まちあるき、たべあるき」がお引越ししてきました

ソート、マージ、分類ごとの集計などの処理のまとめ(JAVA)


まえに、データ構造をまとめたんだけど、そこで
で、保存したデータをどう処理するかは別の機会で・・・
と書いたので、ちょっと思いついた処理たちをメモメモ

(JAVA Ver6でやることを前提に書いてます)。



■ソート
Arrays.sort(ソートしたい配列);
 昇順:そのまま0から、最後まで配列出力
 逆順:最後から0まで出力

*レコードのある要素を基準にソートしたい場合
 ソートしたいレコード群(ファイル)の各レコードに対して
  ・キーを作成し、
  ・ハッシュマップにmap.put(上記キー,レコード);の形で
   レコードをセット
 String keyList =(String)map.keySet().toArray(new String[0]);
  で、キー項目を配列の形で取り出し(キーは文字列とする)
Arrays.sort(keyList);
 keyListの0から最後まで、map.getして、レコードを取り出す




■マージ(併合)
 マージしたい2つのレコード群(ファイル)の各レコードに対して
 まず、元になるレコード群(マスタ)から
  ・キーを作成し、
  ・ハッシュマップにmap.put(上記キー,レコード);の形で
   レコードをセット
 次に、新しいレコード群(トランザクション)から
  ・キーを作成し、
  ・上記ハッシュマップと同じハッシュマップに
   map.put(上記キー,レコード);の形でレコードをセット
 String keyList
=(String)map.keySet().toArray(new String[0]);
  で、キー項目を配列の形で取り出し(キーは文字列とする)
 keyList
の0から最後まで、map.getして、レコードを取り出す

*この操作で、結果として、既存データは最新のもので置き換えられ、
 ないデータは追加される(マージされる)
*Javaでない場合は、HashMapを連想配列にかえる




■最大最小の荒業

 Arrays.sort()する
 0番目の要素が最小値、最終版目(個数-1)が最大

 (ふつーに求めたほうが理論上は早いけど ^^;)




■コード変換

・コード変換表を読み込み、HashMapに
 map.put(コード,言葉);
 の形で入力する

・コードがきたら、map.get(コード)で、その言葉が取得できる

 →本来のハッシュマップの使い方




■存在チェック

・レコード群(ファイル、DB検索結果)の各レコードに対し、
  キーを作成し
  HashMapに map.put(キー,レコード);
 の形で入力する

・存在チェックしたいキーに対して
 map.get(存在チェックしたいキー)
 して、null以外が返ってきたら、存在、nullなら存在しない




■単一化(キー値が複数レコードに存在する場合、それをまとめて1レコード)

・レコード群(ファイル、DB検索結果)の各レコードに対し、
  キーを作成し
  HashMapに map.put(キー,レコード);
 の形で入力する

・そのハッシュマップに対して、
 String keyList =(String)map.keySet().toArray(new String[0]);
  で、キー項目を配列の形で取り出し(キーは文字列とする)
 keyListの0から最後まで、map.getして、レコードを取り出す

*ここで、keyListをソートすると、キー順に出力する

 一方、入力する際に

  HashMapに map.put(キー,配列の添え字番号);

 にして、
 Integer valList
=(Integer)map.valueSet().toArray(new Integer[0]);
 として、値のリストをとり、この値リストをArrays.sortでソートして、

 値リスト(配列の添え字番号)に相当する元データを順に出力すると、
 入力順に単一化できる




■分類

・ハッシュマップ(mapとする)を用意する

・レコード群(ファイル、DB検索結果)の各レコードに対し、
  HashMapから map.get(分類コード);
    で値をとってくる(返り値はArrayListのはず)。

    nullだったら(その分類のデータがない)
      ArrayListをnewして、返り値の変数にセット

  返り値の変数(ArrayList)に、レコードをadd

  map.put(分類コード,返り値の変数);する

・全レコード上記の処理をしたら、
 String keyList
=(String)map.keySet().toArray(new String[0]);
  で、キー項目を配列の形で取り出し(キーは文字列とする)
 keyList
の0から最後まで、map.getすると、分類されたレコード(ArrayList)
 がとれるので、これを順に出力すればOK




■分類ごとに、最大最小合計件数

・ハッシュマップを用意する
  最大用なら、最大用で1つ
  最大最小を同時に求めるなら、
    最大用、最小用、(用途別に)1つづつ

・レコード群(ファイル、DB検索結果)の各レコードに対し、
  (用途別の)HashMapから map.get(分類コード);
    で値をとってくる

    nullだったら(その分類のデータがない)
      最大、最小、合計値の場合、
         map.put(分類コード,そのデータの値);する
      件数だったら
         map.put(分類コード,1);する
    nullじゃなければ
      最大:保存してある値より、そのデータのほうが大きければ
         map.put(分類コード,そのデータの値);する
      最小:保存してある値より、そのデータのほうが小さければ
         map.put(分類コード,そのデータの値);する
      合計:保存してある値に、そのデータをプラスして
         map.put(分類コード,そのデータの値);する
      件数:保存してある値に、1プラスして
         map.put(分類コード,そのデータの値);する

・全レコード上記の処理をしたら、
 String keyList =(String)map.keySet().toArray(new String[0]);
  で、キー項目を配列の形で取り出し(キーは文字列とする)
 keyList[]の0から最後まで、map.getすると、分類された最大値などが全部
 取り出せる