Alphanum - alphanum排序

时间:2017-01-20 06:17:02

标签: java arrays string sorting comparator

我有这样的输入

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中执行此操作的方法???

1 个答案:

答案 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]