gpt4 book ai didi

java - 字母数字 - 字母数字排序

转载 作者:行者123 更新时间:2023-11-30 02:40:49 26 4
gpt4 key购买 nike

我有这样的输入

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

我已经尝试过alphanum排序,这是在link中给出的它给我输出如下所示。

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中做到这一点???

最佳答案

首先以规范的方式格式化信息,为此定义格式:“在线附加组件 750 MB 2014”,例如“frefix 大小大小年份”

然后为其定义一个类(下面示例中的 Capac)

大小可以是一个枚举(示例中的单位)。正确覆盖哈希码和等式。

然后用这些 Capac 对象创建一个列表,并使用双重标准使用预定义的比较器对其进行排序,首先按大小,然后按大小...

示例:

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
}

输出看起来像

[Online Add-on 750.0 MB 2014, Online Add-on 375.0 MB 2015, OnlineAdd-on 1.5 GB 2015, Online Add-on 3.0 GB 2015, Online Add-on 6.0 GB2015, Online Add-on 12.0 GB 2015]

[Online Add-on 375.0 MB 2015, Online Add-on 750.0 MB 2014, OnlineAdd-on 1.5 GB 2015, Online Add-on 3.0 GB 2015, Online Add-on 6.0 GB2015, Online Add-on 12.0 GB 2015]

关于java - 字母数字 - 字母数字排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41757249/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com