スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


--------------------------------------------------------------------------------------

ソートについて

またデッドロックが起こりました。
自分が修正した以外の場所がDBのキー順にソートされていないで連続更新するロジックだったため、場合によってはデッドロックが起こる状態になっていました。
対策として画面表示はそのままに、DB更新時にDBのキー順にソートするロジックを入れました。

というわけで、javaの配列に関してのソートの方法をちょこっと学んだので簡単にまとめておきます。
学んだというよりは復習(SJC-Pの受験範囲です)しました。。

配列のソートをするには、Arrays.sortメソッドを使うのが便利です。
Arrays.sortメソッドの引数には
1・ソートする配列を記述する場合
2・ソートする配列と、配列方法を記述したcomparatorを継承したクラスを記述する場合
と二つ方法があります。

---------------------------------------------------
1・ソートする配列を記述する場合

配列がint型やString型などの定番な配列なら問題はないのですが、一般のclass型の場合はちょこっと制限がつきます。
一般のclass型の場合、そのclassがComparableインターフェースを継承している必要があります。
(IntegerやStringはComparableインターフェースを継承してます)
そして、そのclassの中にcompareToメソッドを好みのソート順になるように実装する必要があります。

例えば、Fruitsクラスはフルーツ名と価格を持っているとします。
そして、フルーツ名の名前、名前が一致する場合、価格順でソートしたい場合、以下のようにFruitsクラスを作成します。

----------------------------------------------------------

/** フルーツクラス */

public class Fruits implements Comparable<Fruits>{
private String name;
private int money;

/** コンストラクタ */
public Fruits(){}

/** コンストラクタ */
public Fruits(String name,int money){
this.name = name;
this.money = money;
}

/** フルーツ名の取得 */
public String getName(){
return name;
}

/** フルーツ名の設定 */
public void setName(String name){
this.name = name;
}

/** 価格の取得 */
public int getMoney(){
return money;
}

/** 価格の設定 */
public void setMoney(int money){
this.money = money;
}

/** ソート順の設定、フルーツ名、名称が同じ場合価格順 */
public int compareTo(Fruits obj){
if (this.name.compareTo(obj.name) > 0){
return 1;
}else if(this.name.compareTo(obj.name) < 0){
return -1;
}else{
if( this.money > obj.money ){
return 1;
}else if (this.money < obj.money){
return -1;
}else{
return 0;
}
}
}
}
----------------------------------------------------------

このロジックのポイントとなるのはcompareToメソッドの中身です。
this.~~と引数Obj.~~を比較してます。thisの方が比較して大きい場合1を、小さい場合は-1を、同じ場合は0にして返すことにより昇順のソートとなります。
もし、降順にしたいのであれば、符号を反転させるだけです。

また、compareToメソッドの引数にFruitsクラスを指定していますが、これはジェネリックスを使っているからで、ジェネリックスを使わない(javaのバージョンが1.4以下)の場合、引数はObjectクラスのみで、メソッドの中は一つ一つFruitsクラスにキャストしなくてはいけません。

ソートが正しく行えるか簡単なテストをするためのサンプル
-----------------------------------------------------------

import java.util.Arrays;

/** ソートのサンプル1 */
public class sortSample1{
public static void main(String args[]){
Fruits[] fruits = new Fruits[5];
for(int i=0; i fruits[i] = new Fruits();
}
fruits[0].setName("melon");
fruits[0].setMoney(1500);

fruits[1].setName("Banana");
fruits[1].setMoney(180);

fruits[2].setName("Apple");
fruits[2].setMoney(100);

fruits[3].setName("Banana");
fruits[3].setMoney(150);

fruits[4].setName("Apple");
fruits[4].setMoney(160);

//ソート前の順番を表示
System.out.println("ソート前の順番を表示");
for(Fruits f: fruits){
System.out.println("フルーツ名 = " + f.getName() + " 価格 = " + f.getMoney());
}

//配列のソートをする。
Arrays.sort(fruits);

//ソート後の順番を表示
System.out.println("");
System.out.println("ソート後の順番を表示");
for(Fruits f: fruits){
System.out.println("フルーツ名 = " + f.getName() + " 価格 = " + f.getMoney());
}
}
}

--------------------------------------------------------

実行結果は以下のようになります。

2009_06_09_sortSample.jpg


---------------------------------------------------
2・ソートする配列と、配列方法を記述したComparatorを継承したクラスを記述する場合

Comparatorを継承したクラスの中にcompareメソッドをオーバーライドし、その中にソートの方法を記述します。

1のときと同じような例で作ります。
Fruits2クラスは名称と、金額があるとします。

---------------------------------------------------
/** フルーツクラス */
public class Fruits2{
private String name;
private int money;

/** コンストラクタ */
public Fruits2(){}

/** コンストラクタ */
public Fruits2(String name,int money){
this.name = name;
this.money = money;
}

/** フルーツ名の取得 */
public String getName(){
return name;
}

/** フルーツ名の設定 */
public void setName(String name){
this.name = name;
}

/** 価格の取得 */
public int getMoney(){
return money;
}

/** 価格の設定 */
public void setMoney(int money){
this.money = money;
}
}

-------------------------------------------------------

Fruits2クラスを名称・金額順でソートするためのFruits2Comparatorクラスを作成します。

-------------------------------------------------------
import java.util.Comparator;

public class Fruits2Comparator implements Comparator<Fruits2>{
public int compare(Fruits2 f1, Fruits2 f2){
if(f1.getName().compareTo(f2.getName()) > 0){
return 1;
}else if(f1.getName().compareTo(f2.getName()) < 0){
return -1;
}else{
if(f1.getMoney() > f2.getMoney()){
return 1;
}else if(f1.getMoney() < f2.getMoney()){
return -1;
}else{
return 0;
}
}
}
}

---------------------------------------------------------

二つ引数がありますが、最初の引数が大きくなるようにすれば昇順です。
降順にしたければ、符号を反転させます。

このロジックでもジェネリックスを使いました。
ジェネリックスを使わない場合は引数にはObjectクラスを指定し、キャストする必要があります。

---------------------------------------------------------
import java.util.Arrays;

/** ソートのサンプル2 */
public class sortSample2{
public static void main(String args[]){
Fruits2[] fruits = new Fruits2[5];
for(int i=0; i fruits[i] = new Fruits2();
}
fruits[0].setName("melon");
fruits[0].setMoney(1500);

fruits[1].setName("Banana");
fruits[1].setMoney(180);

fruits[2].setName("Apple");
fruits[2].setMoney(100);

fruits[3].setName("Banana");
fruits[3].setMoney(150);

fruits[4].setName("Apple");
fruits[4].setMoney(160);

//ソート前の順番を表示
System.out.println("ソート前の順番を表示");
for(Fruits2 f: fruits){
System.out.println("フルーツ名 = " + f.getName() + " 価格 = " + f.getMoney());
}

//配列のソートをする。
Arrays.sort(fruits,new Fruits2Comparator());

//ソート後の順番を表示
System.out.println("");
System.out.println("ソート後の順番を表示");
for(Fruits2 f: fruits){
System.out.println("フルーツ名 = " + f.getName() + " 価格 = " + f.getMoney());
}
}
}
-------------------------------------------------------

実行結果は1と同じようになります。

ブログではタブによる空白がうまく表示されないので、テキストファイルを用意しました。
まとめてみたい方がいらっしゃいましたら、ご自由にどうぞ。こちらです



---------------------------------------------

参考文献
Java 2 Platform SE 5.0 ページ

SJC-Pの勉強で使った教科書
徹底攻略 Java2 プログラマ教科書 Platform 5.0対応 (ITプロ/ITエンジニアのための徹底攻略)



SJC-Pで思い出しましたが、本屋さんに行ったら、SJC-P6.0(310-065)の対応の本が売ってました。
SUN教科書 Javaプログラマ(SJC-P) 5.0・6.0両対応(試験番号310-055、310-065)
Sunの公式ページを見るとまだ、6.0の日本語対応の試験はないようですが、プロメトリック社のSunの試験一覧を見ると英語版の試験はあるみたいですね。
試験時間210分と5.0と比べて20分も増えているところから、問題数も多く、カバーする範囲が広くなっているのでしょうか?
関連記事


--------------------------------------------------------------------------------------

コメントの投稿

非公開コメント

このブログについて
  • 全記事一覧(時間順)
  • このブログについて
  • 私のプロフィール
  • 当ブログで扱っている動画について
  • 記事違いなコメントのお返事

  • カテゴリー
    twitter
    カレンダー
    07 | 2017/08 | 09
    - - 1 2 3 4 5
    6 7 8 9 10 11 12
    13 14 15 16 17 18 19
    20 21 22 23 24 25 26
    27 28 29 30 31 - -
    Amazon
    でたらめな当ブログにぴったりな商品を自動で表示するみたいです。



    月別アーカイブ
    プロフィール

    たづみ

    Author:たづみ
    ・1981年生まれの男
    ・もう少し詳細なプロフィールはこちらで

    最新コメント
    アクセスランキング
    [ジャンルランキング]
    日記
    1032位
    アクセスランキングを見る>>

    [サブジャンルランキング]
    会社員・OL
    212位
    アクセスランキングを見る>>


    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。