用java语言用sort方法实现groupby分组

用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


猜你喜欢

转载自fjding.iteye.com/blog/2311245