我有这样的输入
Online Add-on 3 GB 2015
Online Add-on 1.5 GB 2015
Online Add-on 12 GB 2015
Online Add-on 6 GB
Online Add-on 375 MB 2015
Online Add-on 750 MB 2014
我已经尝试过<{3}}中给出的 alphanum 排序,它给出了如下所示的输出。
Online Add-on 1.5 GB 2015
Online Add-on 3 GB 2015
Online Add-on 6 GB
Online Add-on 12 GB 2015
Online Add-on 375 MB 2015
Online Add-on 750 MB 2014
但是,为了更好的人类可读性,我需要如下所示的输出,如果年份存在,那么基于年份较低的MB必须首先然后降低GB
Online Add-on 750 MB 2014
Online Add-on 375 MB 2015
Online Add-on 6 GB
Online Add-on 1.5 GB 2015
Online Add-on 3 GB 2015
Online Add-on 12 GB 2015
任何在Java中执行此操作的方法???
答案 0 :(得分:2)
首先以规范方式格式化信息,为此定义格式: “在线插件750 MB 2014”,如“frefix size magnitude year”
然后为其定义一个类(下例中的Capac)
幅度可以是Enum(例如,单位)覆盖正确的hashcode和equ。
然后使用这些Capac对象创建一个列表,并使用双重标准对其进行排序,首先使用magnitde,然后按大小进行排序...
public class Capac {
public static void main(String[] args) {
final String arr[] = { "Online Add-on 750 MB 2014", "Online Add-on 375 MB 2015", "Online Add-on 1.5 GB 2015",
"Online Add-on 3 GB 2015", "Online Add-on 6 GB 2015", "Online Add-on 12 GB 2015" };
final List<Capac> myList = new ArrayList<>();
for (final String string : arr) {
myList.add(new Capac(string));
}
System.out.println(myList);
// sort
Collections.sort(myList, new Comparator<Capac>() {
@Override
public int compare(Capac o1, Capac o2) {
if (o1.unit == o2.unit) {
return Double.compare(o1.size, o2.size);
} else {
return Integer.compare(o1.unit.ordinal(), o2.unit.ordinal());
}
}
});
System.out.println(myList);
}
private final double size;
private final int year;
private final Unit unit;
private final String prefix;
public Capac(String ss) {
final String[] rr = ss.split(" ");
prefix = rr[0] + " " + rr[1];
size = Double.parseDouble(rr[2]);
unit = Unit.valueOf(rr[3]);
year = Integer.parseInt(rr[4]);
}
@Override
public String toString() {
return prefix + " " + size + " " + unit + " " + year;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((prefix == null) ? 0 : prefix.hashCode());
long temp;
temp = Double.doubleToLongBits(size);
result = prime * result + (int) (temp ^ (temp >>> 32));
result = prime * result + ((unit == null) ? 0 : unit.hashCode());
result = prime * result + year;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final Capac other = (Capac) obj;
if (prefix == null) {
if (other.prefix != null)
return false;
} else if (!prefix.equals(other.prefix))
return false;
if (Double.doubleToLongBits(size) != Double.doubleToLongBits(other.size))
return false;
if (unit != other.unit)
return false;
if (year != other.year)
return false;
return true;
}
}
enum Unit {
KB, MB, GB, TB
}
outoput看起来像
[在线插件750.0 MB 2014,在线插件375.0 MB 2015,在线 附加1.5 GB 2015,在线附加3.0 GB 2015,在线附加6.0 GB 2015年,在线插件12.0 GB 2015]
和
[在线插件375.0 MB 2015,在线插件750.0 MB 2014,在线 附加1.5 GB 2015,在线附加3.0 GB 2015,在线附加6.0 GB 2015年,在线插件12.0 GB 2015]