用Java写一个如下描述的代码 磁盘的容量单位常用的有M,G,T这三个等级,它们之间的换算关系为1T = 1024G,1G = 1024M,现在给定n块磁盘的容量,请对它们按从小到大的顺序进行稳定排序,例如给定5块盘的容量,1T,20M,3G,10G6T,3M12G9M排序后的结果为20M,3G,3M12G9M,1T,10G6T。注意单位可以重复出现,上述3M12G9M表示的容量即为3M+12G+9M,和12M12G相等。 输入描述:输入第一行包含一个整数n(2 <= n <= 100),表示磁盘的个数,接下的n行,每行一个字符串(长度大于2,小于30),表示磁盘的容量,由一个或多个格式为mv的子串组成,其中m表示容量大小,v表示容量单位,例如20M,1T,30G,10G6T,3M12G9M。磁盘容量m的范围为1到1024的正整数,容量单位v的范围只包含题目中提到的M,G,T三种,换算关系如题目描述。 输出描述:输出n行,表示n块磁盘容量排序后的结果。
时间: 2023-05-26 19:02:10 浏览: 96
```
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String[] disks = new String[n];
for (int i = 0; i < n; i++) {
disks[i] = sc.next();
}
Disk[] objs = new Disk[n];
// 将字符串转为Disk对象
for (int i = 0; i < n; i++) {
objs[i] = new Disk(disks[i]);
}
// 对Disk对象数组进行排序
Arrays.sort(objs);
// 输出排序后的结果
for (int i = 0; i < n; i++) {
System.out.println(objs[i].toString());
}
}
static class Disk implements Comparable<Disk> {
long size; // 磁盘大小
String unit; // 磁盘单位
public Disk(String str) {
String[] strs = str.split("(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)");
long s = Long.parseLong(strs[0]);
String u = strs[1];
// 将磁盘容量单位统一转化为最小单位B
switch (u) {
case "M":
s *= 1024 * 1024;
break;
case "G":
s *= 1024 * 1024 * 1024;
break;
case "T":
s *= 1024 * 1024 * 1024 * 1024;
break;
}
size = s;
unit = "B";
}
@Override
public int compareTo(Disk o) {
if (size == o.size) {
return 0;
} else {
return size < o.size ? -1 : 1;
}
}
@Override
public String toString() {
// 将磁盘容量转化为所需的单位并输出
if (size % (1024 * 1024 * 1024 * 1024L) == 0) { // 大于1T,输出T
return size / (1024 * 1024 * 1024 * 1024L) + "T";
} else if (size % (1024 * 1024 * 1024L) == 0) { // 大于1G,输出G
return size / (1024 * 1024 * 1024L) + "G";
} else if (size % (1024 * 1024) == 0) { // 大于1M,输出M
return size / (1024 * 1024) + "M";
} else {
return size + "B"; // 不大于1M,输出B
}
}
}
}
```
阅读全文