`
fj_ding
  • 浏览: 37103 次
社区版块
存档分类
最新评论

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

    博客分类:
  • java
阅读更多

用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面试800题

    Q0032 Oracle的集合操作函数,如sum(),avg(),max(),min(),与select,where,grouby,having的先后顺序,使用方法 Oracle集合查询基本知识,只有进行分组的列,才可以取在集合查询SQL语句中取字段,先Group By,再Having...

    java面试问题汇总(非常全面)

    表连接的几种方式,事务,存储过程,orderby,groupby - **表连接**:INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN。 - **事务**:一组操作作为一个整体,要么全部成功,要么全部失败。 - **存储过程**:预...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例054 使用sort方法对数组进行排序 67 实例055 反转数组中元素的顺序 68 3.4 常用集合的使用 69 实例056 用动态数组保存学生姓名 69 实例057 用List集合传递学生信息 70 实例058 用TreeSet生成不重复自动排序 随机...

    Java基础精品课23-StreamApi.zip

    5. 分组(groupBy):按照某个属性将元素分组到不同的Map中。 6. 排序(sort):对流中的元素进行排序。 五、Stream API与传统for循环的区别 1. 代码简洁:Stream API使用链式调用,减少代码量,提高可读性。 2. 支持...

    SparkSQL入门级教程

    - **分组聚合**:使用 `groupBy` 后跟聚合函数(如 `count`, `sum`, `avg` 等)进行分组统计。 - **表连接查询**:通过 `join` 方法实现不同 DataFrame 的连接,包括内连接(默认)、左连接、右连接等。 - **查看列...

    程序结合SQL语句结构,动态实现SQL多条件查询语句代码

    其中,SELECT用于指定要查询的列,FROM指定了数据来源,WHERE用于设置筛选条件,GROUP BY用于对结果进行分组,HAVING则是在分组后对组进行筛选,最后ORDER BY用来排序结果。 在实际编程中,我们可能需要根据用户...

    Big Data Frameworks Scala and Spark Tutorial

    接下来,使用`groupBy`方法按单词分组,并计算每个单词的出现次数。最后,按照出现次数排序并选取前10个单词打印出来。 #### 结论 Scala和Spark的结合为大数据处理提供了一种强大而灵活的方法。Scala的简洁语法和...

    大数据基本语法.docx

    【大数据基本语法】和【java基础+大数据入门的笔记语法、示例】这两个主题涵盖了编程基础、Java语言特性以及大数据处理的相关知识点。以下是这些知识点的详细解释: 1. **集合操作**: - `list.get(index)`:返回...

    php中的Collection集合类.zip

    10. **分组元素**:`groupBy()`方法根据元素的某个属性将集合元素分组。 11. **转换操作**:`toArray()`和`toJson()`等方法将集合转换为PHP数组或JSON格式。 12. **异常处理**:集合类可能还包括一些确保数据完整...

    Hadoop技术-Pig简介.pptx

    例如,`load`用于加载数据,`foreach`用于遍历数据,`filter`用于筛选数据,`group by`用于数据分组,`order by`用于排序,`join`用于数据关联,`generate`用于提取列,`union`和`intersect`用于集合运算,`dump`...

    对日项目中经常使用到的单词

    7. **グループ バイ(Group By)**:在SQL查询中,GROUP BY用于将数据按指定列进行分组。 8. **オーダ バイ(Order By)**:ORDER BY语句用于对查询结果进行排序。 9. **ソート(sort)**:排序是对数据进行排列的过程...

    BDMS:大数据系统与大规模数据分析-2021春-homework

    通过对"BDMS-main"这个压缩包文件的学习,学生能够深入理解哈希和分组在大数据分析中的应用,并掌握用Java编程语言实现这些概念的实际技巧。这个作业不仅锻炼了理论知识,还提升了实际编程能力,为后续的大数据分析...

    Scala-简易详解文章

    `foreach`遍历集合,`distinct`去除重复元素,`map`和`flatMap`进行转换,`filter`筛选元素,`sorted`、`sortBy`和`sortWith`排序,`groupBy`按指定条件分组,`reduce`和`fold`进行聚合,`collect`根据模式匹配转换...

    2021-2022计算机二级等级考试试题及答案No.17864.docx

    - **例题解析**:题目指出 HAVING 子句必须与 GROUP BY 子句一起使用,并且可以与 WHERE 子句一起使用。HAVING 子句的作用是限定分组的条件。 ### 7. 需求分析常用工具 - **知识点概述**:在软件开发过程中,需求...

Global site tag (gtag.js) - Google Analytics