Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何根据自定义顺序对java列表进行排序_Java_Sorting_Collections - Fatal编程技术网

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

如何根据自定义顺序对java列表进行排序,java,sorting,collections,Java,Sorting,Collections,我正在尝试根据自定义顺序对列表进行排序,我已经按照链接进行了操作。 自定义顺序必须如下所示:“ST,SIT,JDC”,这是使用customOrder中的数组列表完成的。 从数据库提交的数据必须按照上面的顺序显示在一个列表中,但问题是,只有当来自数据库的数据与这个列表完全匹配时,这才有效,比如如果我有一个确切的单词“ST”或“SIT”,那么它就完成了任务但我从数据库中获取的数据如下所示: ST1、ST2、ST3、SIT1、SIT2、JDC释放、JDC停止、JDC 10 此代码不适用于我的数据,结果

我正在尝试根据自定义顺序对列表进行排序,我已经按照链接进行了操作。 自定义顺序必须如下所示:“ST,SIT,JDC”,这是使用customOrder中的数组列表完成的。 从数据库提交的数据必须按照上面的顺序显示在一个列表中,但问题是,只有当来自数据库的数据与这个列表完全匹配时,这才有效,比如如果我有一个确切的单词“ST”或“SIT”,那么它就完成了任务但我从数据库中获取的数据如下所示:

ST1、ST2、ST3、SIT1、SIT2、JDC释放、JDC停止、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;
        }
    });
List environments=environmentDAO.getAll();
最终列表customOrder=Arrays.asList(“ST”、“SIT”、“JDC”);
Collections.sort(环境,新的Comparator(){
@凌驾
公共整数比较(最终环境o1,最终环境o2){
Integer firstValue=Integer.valueOf(customOrder.indexOf(o1.getAcronym());
Integer secondValue=Integer.valueOf(customOrder.indexOf(o2.getAcronym());
int comparedTo=firstValue.compareTo(secondValue);
回报率比较;
}
});

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

对于未找到的元素,将返回-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;
        }
    }

但是会出现一些边缘情况,如前缀重叠等。无论如何,我已经尝试了这段代码,它对您的数据有效。

您的解释似乎很不清楚。提供样本数据,以及当它已经排序时,您期望它的外观。您自定义的排序顺序是什么?请公布预期结果。任何
集合
都可以使用
集合进行排序。sort()
只要您提供正确的
编撰器
。我看可以。到底是什么不起作用?它是在抛出异常吗?顺序颠倒了吗?我已经准确地更新了问题,但我不知道该怎么做?我刚刚尝试了代码,它运行得很好。非常感谢:-)