如何根据自定义顺序对Java列表进行排序

时间:2014-02-10 16:25:33

标签: java sorting collections

我正在尝试针对自定义订单对列表进行排序,我已经按照stackOverflow链接进行了操作。 自定义顺序必须如下:“ST,SIT,JDC”已在customOrder中使用数组列表完成。 并且从数据库提交的数据必须按照上面的顺序显示在列表中,但问题是这只有在数据库中的数据与此列表完全匹配时才有效,就像我有一个确切的单词“ST”或“SIT”然后就完成了这项工作。 但是我从数据库中获取的数据如下所示:

  

ST1,ST2,ST3,SIT1,SIT2,JDC Release,JDC Stop,JDC 10

此代码对我的数据不起作用,结果中没有错误,但根本没有对数据进行排序。

这是代码:

List<Environment> environments = environmentDAO.getAll(); 
final List<String> customOrder = Arrays.asList("ST", "SIT", "JDC");

    Collections.sort(environments, new Comparator<Environment>() {

        @Override
        public int compare(final Environment o1, final Environment o2) {

            Integer firstValue = Integer.valueOf(customOrder.indexOf(o1.getAcronym()));
            Integer secondValue = Integer.valueOf(customOrder.indexOf(o2.getAcronym()));

            int comparedTo = firstValue.compareTo(secondValue);

            return comparedTo;
        }
    });

1 个答案:

答案 0 :(得分:1)

问题是,您没有在customOrder列表中定义所有可能性。

对于未找到的元素,

List.indexOf将返回-1,在您的情况下,它是一切,所以没有任何内容被排序

因此,您需要举例说明customOrder只是一个前缀列表。那是你要的吗? 在这种情况下,你需要找到第一个匹配的索引,并且还要跟踪余数,以防两个比较字符串具有相同的前缀:

    @Override
    public int compare(final Environment o1, final Environment o2) {
        int order1=-1;
        int order2=-1;
        String remainder1="";
        String remainder2="";
        for (String prefix: customOrder){
            if (o1.getAcronym().startsWith(prefix)){
                order1=customOrder.indexOf(prefix);
                remainder1=o1.getAcronym().substring(prefix.length());
            }
            if (o2.getAcronym().startsWith(prefix)){
                order2=customOrder.indexOf(prefix);
                remainder2=o2.getAcronym().substring(prefix.length());
            }
        }
        if (order1==order2){
            return remainder1.compareTo(remainder2);
        }
        else{
            return order1-order2;
        }
    }

但是会有一些边缘情况,例如重叠前缀等。无论如何,我已经尝试过这段代码,它可以处理您的数据。