用java語言用sort方法實現groupby分組

小鞅發表於2015-04-20

用java語言用sort方法實現groupby分組


    用排序的方法實現groupby分組,給定資料如下所示。


老王|A|90
李四|B|87
張三|C|70
老王|A|67
張三|A|98
李四|B|76
張三|C|67
張三|C|78
李四|A|89

源程式

import java.io.*;
import java.util.*;

public class DataProcess {

public static void main(String[] args) throws Exception {
    String[][] arr = getFile("C:\\Users\\fj-ding\\Desktop\\hw1\\test.txt");
    Sortchart sc = new Sortchart();
    // 第1列,表示要選擇groupby的類別,第2列表示參見計算的資料列,從第0列開始算
    int groubyKey = 0;
    int dataLine = 2;
    sc.process(arr, groubyKey, dataLine);
    sc.outputFunction();
    System.out.println("我是原矩陣****************************************");
    for (int i = 0; i < arr.length; i++) {
        for (int j = 0; j < arr[i].length; j++) {
            System.out.print(arr[i][j] + "  ");
        }
        System.out.println();
    }
}

private static String[][] getFile(String pathName) throws Exception {
    File file = new File(pathName);
    if (!file.exists())
        throw new RuntimeException("Sorry,Not File!");
    BufferedReader br = new BufferedReader(new FileReader(file));

    String str;

    List<String[]> list = new ArrayList<String[]>();
    while ((str = br.readLine()) != null) {

        int j = 0;
        // 正規表示式。
        String arr[] = str.split("\|");

        String[] dArr = new String[arr.length];
        for (String ss : arr) {

            dArr[j++] = ss;
        }
        list.add(dArr);
    }
    int max = 0;
    for (int i = 0; i < list.size(); i++) {
        if (max < list.get(i).length)
            max = list.get(i).length;
    }
    // 這個是動態的了,陣列長度。size:泛型的個數。
    String[][] sanjiaoxing = new String[list.size()][max];
    for (int i = 0; i < sanjiaoxing.length; i++) {
        for (int j = 0; j < list.get(i).length; j++) {
            // 這是一種寫法,有點複雜。
            sanjiaoxing[i][j] = list.get(i)[j];
        }
    }
    return sanjiaoxing;
}
}

class Sortchart {
String[][] matrixTable;
int column;
String[][] okMatrix;
int dataColumn;

public void process(String[][] matrixTable, int column, int dataColumn) {
    int a = 0;
    List list0 = new ArrayList();
    this.matrixTable = matrixTable;
    this.column = column;
    this.dataColumn = dataColumn;
    for (int i = 0; i < matrixTable.length; i++) {
        list0.add(matrixTable[i][column]);
    }
    Collections.sort(list0);
    // 將行向量多加一行,以查詢時防止越界。
    okMatrix = new String[matrixTable.length + 1][matrixTable[0].length];
    for (int j = 0; j < matrixTable.length; j++) {
        a = 1;
        for (int i = 0; i < matrixTable.length; i++) {
            if (matrixTable[i][column] == list0.get(j) && a == 1) {
                for (int k = 0; k < matrixTable[0].length; k++) {
                    okMatrix[j][k] = matrixTable[i][k];

                    a = 0;
                }

            }
        }
    }
    // 排列以後的矩陣
    System.out.println("我是新矩陣**************************************");
    for (int i = 0; i < matrixTable.length; i++) {
        for (int j = 0; j < matrixTable[0].length; j++) {
            System.out.print(okMatrix[i][j] + "  ");
        }
        System.out.println();
    }
}

public void outputFunction() {
    // ArrayList list1=new ArrayList();
    double[] darr = new double[matrixTable.length];
    int count = 0;
    double sum = 0;
    double avg = 0;
    for (int i = 0; i < matrixTable.length; i++) {
        for (int j = 0; j < matrixTable[0].length; j++) {
            if (okMatrix[i][j].equals(okMatrix[i][column])) {
                darr[i] = Double.parseDouble(okMatrix[i][dataColumn]);
                // darr[i+1]=Double.parseDouble(okMatrix[i+1][column+1]);
                // 小心越界問題
                if (okMatrix[i][j].equals(okMatrix[i + 1][j])) {
                    // sum=darr[i];
                    sum = sum + darr[i];
                    count++;

                } else {
                    sum = sum + darr[i];
                    avg = sum / (count + 1);
                    // list1.add(sum);
                    System.out.println("key:" + okMatrix[i][j] + " 求和:"
                            + sum + " 次數:" + (count+1) + " 均值:" + avg);
                    sum = 0;
                    count = 0;
                }

            }

        }

    }

}

}

輸出結果


我是新矩陣****************************

張三 C 70
張三 A 98
張三 C 67
張三 C 78
李四 B 87
李四 B 76
李四 A 89
老王 A 90
老王 A 67
key:張三 求和:313.0 次數:4 均值:78.25
key:李四 求和:252.0 次數:3 均值:84.0
key:老王 求和:157.0 次數:2 均值:78.5

我是原矩陣*****************************************

老王 A 90
李四 B 87
張三 C 70
老王 A 67
張三 A 98
李四 B 76
張三 C 67
張三 C 78
李四 A 89


<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>

相關文章