16.磁盘容量排序

磁盘的容量单位常用的有M G T , 他们之间的换算关系为 1T =1024G 1G=1024M
现在给定n块磁盘的容量,请对他们按从小到大的顺序进行稳定排序

例如给定5块盘的容量
5
1T
20M
3G
10G6T
3M12G9M

排序后的结果为
20M
3G
3M 12G 9M
1T,10G 6T
注意单位可以重复出现

上述3M 12G 9M表示的容量即为 3M 12G 9M 和12M 12G相等


输入描述、
输入第一行包含一个整数n, 2<=n<=100 表示磁盘的个数
接下来的n行,每行一个字符串,2<长度<30 ,表示磁盘的容量
由一个或多个格式为MV的子串组成,其中m表示容量大小,v表示容量单位。例如20M 1T, 磁盘容量的范围1~1024的正整数,单位 M G T

输出n行,表示n块磁盘容量排序后的结果。

实例
输入
3
1G
2G
1024M


输出
1G
1024M
2G
说明:稳定排序要求相等值保留原来位置

示例2
3
2G4m
3M2G
1T

输出
3M2G
2G4M
1T

 

查看代码

import java.util.*;

public class Demo16 {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = Integer.parseInt(sc.nextLine());

        //接收数据
        ArrayList<String> list = new ArrayList<>();
        for(int i = 0; i < n; i++){
            list.add(sc.nextLine());
        }

        list.sort(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return getChange(o1) - getChange(o2);
            }
        });

        for(String s : list){
            System.out.println(s);
        }
    }


    //辅助函数
    private static int getChange(String s){
        String temp = s.toUpperCase();
        String[] split = temp.split("[A-Z]");
        int sum = 0;  //记录s同一单位后的数值
        int length = 0;  //定位单位位置所用
        
        for(int i = 0; i < split.length; i++){
            int num = Integer.parseInt(split[i]);
            length += split[i].length();
            char c = temp.charAt(length); 
            switch(c){
                case 'M' :
                    sum += num;
                    break;
                case 'G' :
                    sum += num * 1024;
                    break;
                case 'T' :
                    sum += num * 1024 * 1024;
                    break;
            }
            length++;
        }
        return sum;
    }
}

 

总结:统一单位的好思路,辅助函数中定位单位的操作蛮好。

 

posted @ 2022-03-25 21:05  Jukim  阅读(1430)  评论(0编辑  收藏  举报