2019-8-31 [Java] 面试题:根据数据大小 进行排序展示

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());
}

5.效果

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值