欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-11 10:45:25
...

用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


相关标签: java group