トップページに戻る    次のJavaアルゴリズムパズルへ

2-1 SQLの集合関数もどき

Javaアルゴリズムパズル

SQLの集合関数もどきを作成する。

・最頻値
・中央値
・最大値
・Top3 (dense_rankが3以下)
を求めます。


ソース

public final class deriveAggVal{
    class RowDataDef {
        String Key;
        int Val;
        RowDataDef(String Key,int Val){
            this.Key = Key;
            this.Val = Val;
        }
    }

    public static void main(String[] args) {
        deriveAggVal mi = new deriveAggVal();
        mi.main();
    }

    RowDataDef RowData[] = new RowDataDef[22];
    int UPB;

    void main() {
        RowData[0] = new RowDataDef("A",1);
        RowData[1] = new RowDataDef("A",2);
        RowData[2] = new RowDataDef("A",3);
        RowData[3] = new RowDataDef("A",4);
        RowData[4] = new RowDataDef("B",1);
        RowData[5] = new RowDataDef("B",2);
        RowData[6] = new RowDataDef("A",4);
        RowData[7] = new RowDataDef("A",3);
        RowData[8] = new RowDataDef("C",9);
        RowData[9] = new RowDataDef("C",8);
        RowData[10] = new RowDataDef("C",5);
        RowData[11] = new RowDataDef("C",6);
        RowData[12] = new RowDataDef("D",4);
        RowData[13] = new RowDataDef("D",5);
        RowData[14] = new RowDataDef("A",9);
        RowData[15] = new RowDataDef("E",7);
        RowData[16] = new RowDataDef("E",7);
        RowData[17] = new RowDataDef("E",7);
        RowData[18] = new RowDataDef("E",7);
        RowData[19] = new RowDataDef("E",7);
        RowData[20] = new RowDataDef("E",7);
        RowData[21] = new RowDataDef("E",8);

        UPB = RowData.length-1;

        //基本選択法でソート
        int minP;
        for (int I=0;I<=UPB-1;I++){
            minP = I;
            for (int J=I;J<=UPB;J++)
                if (RowData[minP].Key.compareTo(RowData[J].Key) > 0
                 || (RowData[minP].Key.equals(RowData[J].Key)
                  && RowData[minP].Val > RowData[J].Val))
                minP=J;

            if (minP!=I){
                String WK_Key;int WK_Val;
                WK_Key = RowData[I].Key; WK_Val = RowData[I].Val;
                RowData[I].Key = RowData[minP].Key ; RowData[I].Val = RowData[minP].Val;
                RowData[minP].Key = WK_Key ; RowData[minP].Val = WK_Val;
            }
        }

        //最頻値
        mode();

        //中央値
        median();

        //最大値
        max();

        //Top3
        Top3();
    }

    private void mode(){
    }

    private void median(){
        String saveKey = RowData[0].Key;

        int[] intArray = new int[200];
        int cnt = 0;
        double median;

        for (int i=0;i<=UPB;i++){
            if (!saveKey.equals(RowData[i].Key)){

                if (cnt%2==0) median = (intArray[cnt/2]
                                       +intArray[cnt/2+1])/2;
                else median = intArray[(int)Math.ceil(cnt/2)];
                System.out.println(saveKey + "の中央値は" + Double.toString(median));

                saveKey = RowData[i].Key;
                cnt=0;
            }

            intArray[++cnt] = RowData[i].Val;

            if (i==UPB){
                if (cnt%2==0) median = (intArray[cnt/2]
                                       +intArray[cnt/2+1])/2;
                else median = intArray[(int)Math.ceil(cnt/2)];
                System.out.println(saveKey + "の中央値は" + Double.toString(median));
            }
        }
    }

    private void max(){
        String saveKey = RowData[0].Key;
        int kariMax    = RowData[0].Val;
        for (int i=0;i<=UPB;i++){

            if (!saveKey.equals(RowData[i].Key)){
                System.out.println(saveKey + "の最大値は" + Integer.toString(kariMax));
                saveKey = RowData[i].Key;
                kariMax = RowData[i].Val;
            }

            else if (kariMax < RowData[i].Val) kariMax = RowData[i].Val;

            if (i==UPB) System.out.println(saveKey + "の最大値は" + Integer.toString(kariMax));
        }
    }

    private void Top3(){
    }
}


実行結果

A,1
A,2
A,3
A,3
A,4
A,4
A,9
B,1
B,2
C,5
C,6
C,8
C,9
D,4
D,5
E,7
E,7
E,7
E,7
E,7
E,7
E,8
Aの中央値は3.0
Bの中央値は1.0
Cの中央値は7.0
Dの中央値は4.0
Eの中央値は7.0
Aの最大値は9
Bの最大値は2
Cの最大値は9
Dの最大値は5
Eの最大値は8