多易javaSE基础 day3 课程日志 快排 插排 电影数据分析练习

今天又练习了快速排序,参考了别人的代码后终于理解,找到了问题的所在.代码如下.

package day03;

public class Demo1 {

    private static void quickSort(int[] a, int low, int high) {
        int i;          //低位
        int j;          //高位
        int key;        //基准位
        int t;          //交换变量

        i = low;        //i的初始值设为低位
        j = high;       //j的初始值设为高位

        if (low>high) return;    //初始值异常,终止

        key = a[low];   //最左侧元素担任基准位
                        // 此语句必须在异常判断之后,否则会出现数组越界错误 原因是递归的low是j+1
                        //j最终会指向数组的最后一项.j+1会超过数组的边界

        while(i<j){
            while(a[j]>=key && i<j){     //从右侧找到比基准位小的值的位置
                j--;
            }
            while(a[i]<=key && i<j){     //从左侧找到比基准位大的值的位置
                i++;
            }
            if (i<j){
                t = a[j];                   //交换两个值的位置
                a[j] = a[i];
                a[i] = t;
            }
        }
        //此时i,j指向同一位置,将此值与最低位(基准位)交换位置,使比基准位小的都在左边,比基准位大的都在右边.一次快排完成
        a[low] = a[i];
        a[i] = key;
        //分别在左侧和右侧继续进行快排
        quickSort(a,low,j-1);
        quickSort(a,j+1,high);
    }

    private static void putArr(int[] a) {
        for (int i =0;i<a.length;i++){
            System.out.print(a[i]+" ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        int[] a = {12,8,75,4,5,4,3,7,23,32,25,47,56};
//        System.out.println(a.length-1);
        quickSort(a,0,a.length-1);
        putArr(a);
    }
}

接着练习了插入排序,比较简单.代码如下,

package day03;

/**
 * 插入排序法
 */
public class Demo2 {
    public static void main(String[] args) {
        int[] a = {23, 24, 22, 12, 25};
        insertSort(a);
        putArr(a);
    }

    private static void putArr(int[] a) {
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i] + " ");
        }
        System.out.println();
    }

    private static void insertSort(int[] a) {
        int t;

        for (int j = 1; j < a.length; j++) {    //游标 从第二位开始向后循环
            for (int i = 0; i < j; i++) {       //基准位 从第一位开始向其中添加元素
                if (a[j] < a[i]) {  
                    t = a[j];
                    for (int q = j - 1; q >= i; q--) {  //将游标前的记录向后移动一位
                        a[q + 1] = a[q];
                    }
                    a[i] = t;                   //将j位置元素插入至i位置
                    break;                      //跳出 游标后移 继续比对下一个元素
                }
            }
        }

    }

}

今天晚上跟着做了涛哥的数据分析小项目.遇到了不会解决的问题.

package day03;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;

import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class Demo3 {


    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("d:/test/rating.json");
        BufferedReader br = new BufferedReader(new InputStreamReader(fis));
        String line = "";

        HashMap<String, Integer> countMap = new HashMap<>();    //ID--count哈希表
        HashMap<String, Double> rateMap = new HashMap<>();     //ID--rate哈希表



        while((line=br.readLine())!=null){  //读取一行数据,如果不为空
            //解析出movieId
            JSONObject jsonObject = JSON.parseObject(line);
            String movieId = jsonObject.getString("movie"); //解析出每一行的ID

            Double rate = jsonObject.getDouble("rate");     //解析出每一行的分数

//            System.out.println(movieId);
            if (countMap.containsKey(movieId)){
                //如果已存在 将计数值加1
                Integer count = countMap.get(movieId);
                countMap.put(movieId,count+1);
            }else{
                //如果不存在 新增一条hashmap记录
                countMap.put(movieId,1);
            }


            if(rateMap.containsKey(movieId)){
                //如果已存在 将分数与原分数相加
                Double aDouble = rateMap.get(movieId);
                // System.out.println(aDouble);
                double t = aDouble;
                rateMap.put(movieId,(aDouble+rate));
            }else {
                //如果不存在 新增一条hashmap记录
                rateMap.put(movieId,rate);
            }

        }
        br.close();
       // System.out.println(countMap);
       // System.out.println(rateMap);

        FileOutputStream fos1 = new FileOutputStream("d:/movie1.txt");

        Set<Map.Entry<String, Double>> entrySet1 = rateMap.entrySet();
        for (Map.Entry<String, Double> ent:entrySet1){
            fos1.write((ent.getKey()+"--->"+ent.getValue()+"\r\n").getBytes());
        }
        fos1.close();


        FileOutputStream fos = new FileOutputStream("d:/movie.txt");

        Set<Map.Entry<String, Integer>> entrySet = countMap.entrySet();
        for (Map.Entry<String, Integer> ent:entrySet){
            fos.write((ent.getKey()+"--->"+ent.getValue()+"\r\n").getBytes());
        }
        fos.close();
        System.out.println();




//        String line = br.readLine();
//        System.out.println(line);
//
//        JSONObject jsonObject = JSON.parseObject(line);
//        String movie = jsonObject.getString("movie");
//        String rate = jsonObject.getString("rate");
//        System.out.println(movie);
//        System.out.println(rate);



    }
}

第47行,两数相加会提示NullPointerException错误.只输入aDouble不会出错,但它与其他数做运算就会出错.rate与其他数做运算不会出错.只取json数据前几千条的话,可以正常运算不会出错.不知道哪里出了问题.

猜你喜欢

转载自blog.csdn.net/weixin_44855583/article/details/107574596