用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
相关文章推荐
- 使用Java语言实现,自动生成10个整数(1~100,求出生成数列中的最大值和最小值,不允许使用Arrays类的sort方法
- 使用Java语言实现,自己主动生成10个整数(1~100,求出生成数列中的最大值和最小值,不同意使用Arrays类的sort方法
- 多种方法实现。递归算法和标准函数库(STL)实现全排列+sort在全排列前的排序
- 数据结构——六种Sort方法的代码实现
- PHP实现根据数组的值进行分组的方法
- Arrays.sort方法的实现过程,以字符数组为例
- PHP基于ICU扩展intl快速实现汉字转拼音及按拼音首字母分组排序的方法
- 基数排序的两种实现方法--Radix Sort
- 实现对多维数组按照某个键值排序的两种方法(array_multisort和array_sort)
- 数组排序方法的性能比较(中):Array.Sort 实现分析
- LINQ技巧:如何通过多次调用GroupBy实现分组嵌套
- java Collections.sort()实现List排序的默认方法和自定义方法
- Java Collections.sort()实现List排序的默认方法和自定义方法
- mysql使用GROUP BY分组实现取前N条记录的方法
- java Collections.sort()实现List排序的默认方法和自定义方法
- ThinkPHP5 资源嵌套分组路由配置方法(可以根据需要实现多层嵌套,注意:资源嵌套分组路由配置顺序依次是嵌套层次递减) - 06
- js模拟实现Array的sort方法
- js模拟实现Array的sort方法
- Sql字符串分组Split函数的两种实现方法
- 数组排序方法的性能比较(2):Array.Sort<T>实现分析