用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
下一篇: @WebServlet注解的使用