0.特别鸣谢
本代码由远翔同学提供
1.需求:
根据使用量将下列数据进行排序 然后按照使用量的高低进行 数据展示
读取以下文档,按照大小排序,1G>1024M>1024K>1024B
396.9 K /user/007
593.5 K /user/12_hl
0 /user/1LB
0 /user/96256
701.3 M /user/Amanda
611.3 M /user/ChenQingkang
712.6 M /user/ChenQingkang12
943.0 K /user/DAIhe
9.8 M /user/DAIhe199713
0 /user/Enning
47.9 M /user/Kung15
5.0 G /user/LT
105 /user/LZY
611.3 M /user/LiuChengcheng12
76.4 M /user/Ruler13
420.6 K /user/Rulue13
7.0 K /user/TZM11
673.7 M /user/WangYun12
0 /user/XXXXX
610.6 M /user/YC
12.2 M /user/YuanShiXiong13
31.2 M /user/anonymous
230 /user/avro
2.8 G /user/bailina13
105.5 M /user/baoyu13
1.3 G /user/begin
618.7 M /user/caoenning15
673.5 M /user/caoguangzhou13
730.6 M /user/caohuyue13
613 /user/caomingyang
4.5 G /user/caomingyang12
740.4 M /user/caowenhao13
0 /user/caozhuang
996.1 M /user/caozhuang12
610.6 M /user/changjinfang15
0 /user/chaoran2
4.7 G /user/chenbojie09
9.7 M /user/chengshaoqi10
1.4 G /user/chengzhen11
610.6 M /user/chenjianfei
623.7 M /user/chenjianfei13
3.6 M /user/chenjinbiao
1.6 K /user/chenjinbiao10
611.3 M /user/chenpeng15
195 /user/chenqingakng12
3.5 G /user/chenqingkang12
3.5 G /user/chenshengjian13
412 /user/chentao
611.3 M /user/chentao15
3.1 G /user/chenteng09
2.分析
抽取数据 --> 首先将数据对于大小G,M,K进行分组 --> 分别进行大小对比排序 --> java实现
3.实现代码
本代码选用的文档地址C:/Users/My/Desktop/test.txt
建议将自己的文档改为.txt结尾,这样不会报错
修改此地址即可
package project_TopN;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
public class topN2 {
public static void main(String[] args) throws IOException {
BufferedReader readfile = new BufferedReader(new FileReader("C:/Users/My/Desktop/test.txt"));
//Key键表示用户姓名 ,Value值表示用户存储的大小
Map<String, Double> gMap = new HashMap<>();//存储用量单位为G的用户信息
Map<String, Double> mMap = new HashMap<>();//存储用量单位为M的用户信息
Map<String, Double> kMap = new HashMap<>();//存储用量单位为K的用户信息
Map<String, Integer> zMap = new HashMap<>();//存储用量为0的用户信息
StringBuffer sb = new StringBuffer();
String text = null;
//readline()读取文件中的每一个文本行
while ((text = readfile.readLine()) != null) { // 从文件中读出来字符串
//indexOf()获取指定参数的位置信息
int count = text.indexOf("/");//为了确定用户名,先找到第一个"/"的位置索引
//substring()获取字符串中一个或多个子字符串
String k = text.substring((count + 6));//将第一个/的位置向后推6位,读取到的字符串为用户名k
String v1 = text.substring(0, count-1);//从第0位读到第一个/位置的前一位,读取到的字符串为用户的数据大小v1
String v = v1.replace(" ","");//去除v1中的空格,得到v
//length()获取长度
int l = v.length();//将每个v的长度记为l
/*
* 通过用量的最后一个字符判断单位,准备分别存储
* 提取数据大小字符串的数字部分(去除单位)
* 将字符串转化为double类型的数据,以便后续排序比较
* 分别存储数据,此时数据不带单位,但是已经进行了分组
*/
if ("G".equals(v.substring(l-1))){
String vv = v.substring(0, v.length()-1);//提取数据大小字符串的数字部分(去除单位)
double d;
d=Double.parseDouble(vv);//将字符串转化为double类型的数据
gMap.put(k,d);//分别存储数据,此时数据不带单位
}else if ("M".equals(v.substring(l-1))){
String vv = v.substring(0, v.length()-1);
double d;
d=Double.parseDouble(vv);
mMap.put(k,d);
}else if ("K".equals(v.substring(l-1))){
String vv = v.substring(0, v.length()-1);
double d;
d=Double.parseDouble(vv);
kMap.put(k,d);
}else {
zMap.put(k,0);
}
}
readfile.close();
//将map集合转化成list集合进行排序
//用量单位为G的集合
List<Map.Entry<String,Double>> list1 = new ArrayList<Map.Entry<String,Double>>(gMap.entrySet());
Collections.sort(list1,new Comparator<Map.Entry<String,Double>>() {
//自定义比较器,降序排列
@Override
public int compare(Entry<String, Double> o1, Entry<String, Double> o2) {
return -o1.getValue().compareTo(o2.getValue());
}
});
//遍历输出
for(Entry<String, Double> mapping:list1){
if (mapping.getKey().length() < 8) {
System.out.println(mapping.getKey()+"\t\t\t"+mapping.getValue()+"G");
}else if (mapping.getKey().length() < 16) {
System.out.println(mapping.getKey()+"\t\t"+mapping.getValue()+"G");
}
}
//用量单位为M的集合
List<Map.Entry<String,Double>> list2 = new ArrayList<Map.Entry<String,Double>>(mMap.entrySet());
Collections.sort(list2,new Comparator<Map.Entry<String,Double>>() {
//自定义比较器,降序排列
@Override
public int compare(Entry<String, Double> o1, Entry<String, Double> o2) {
return -o1.getValue().compareTo(o2.getValue());
}
});
//遍历输出
for(Entry<String, Double> mapping:list2){
if (mapping.getKey().length() < 8) {
System.out.println(mapping.getKey()+"\t\t\t"+mapping.getValue()+"M");
}else if (mapping.getKey().length() < 16) {
System.out.println(mapping.getKey()+"\t\t"+mapping.getValue()+"M");
}
}
//用量单位为K的集合
List<Map.Entry<String,Double>> list3 = new ArrayList<Map.Entry<String,Double>>(mMap.entrySet());
Collections.sort(list3,new Comparator<Map.Entry<String,Double>>() {
//自定义比较器,降序排列
@Override
public int compare(Entry<String, Double> o1, Entry<String, Double> o2) {
return -o1.getValue().compareTo(o2.getValue());
}
});
//遍历输出
for(Entry<String, Double> mapping:list3){
if (mapping.getKey().length() < 8) {
System.out.println(mapping.getKey()+"\t\t\t"+mapping.getValue()+"K");
}else if (mapping.getKey().length() < 16) {
System.out.println(mapping.getKey()+"\t\t"+mapping.getValue()+"K");
}
}
//用量单位为0的集合
List<Map.Entry<String,Integer>> list4 = new ArrayList<Map.Entry<String,Integer>>(zMap.entrySet());
Collections.sort(list4,new Comparator<Map.Entry<String,Integer>>() {
//自定义比较器,降序排列
@Override
public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
return -o1.getValue().compareTo(o2.getValue());
}
});
//遍历输出
for(Entry<String, Integer> mapping:list4){
if (mapping.getKey().length() < 8) {
System.out.println(mapping.getKey()+"\t\t\t"+mapping.getValue());
}else if (mapping.getKey().length() < 16) {
System.out.println(mapping.getKey()+"\t\t"+mapping.getValue());
}
}
}
}
4.比较器
//自定义比较器,降序排列
@Override
public int compare(Entry<String, Double> o1, Entry<String, Double> o2) {
return -o1.getValue().compareTo(o2.getValue());
}