今天又练习了快速排序,参考了别人的代码后终于理解,找到了问题的所在.代码如下.
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数据前几千条的话,可以正常运算不会出错.不知道哪里出了问题.