您的位置:首页 > 编程语言 > Java开发

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

2015-04-20 14:19 47 查看

用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;
}

}

}

}

}

}


输出结果

我是新矩阵[b]****************************[/b]

张三 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

我是原矩阵[b]*****************************************[/b]

老王 A 90

李四 B 87

张三 C 70

老王 A 67

张三 A 98

李四 B 76

张三 C 67

张三 C 78

李四 A 89
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐