如何根据自定义顺序对java列表进行排序
我正在尝试根据自定义顺序对列表进行排序,我已经按照链接进行了操作。 自定义顺序必须如下所示:“ST,SIT,JDC”,这是使用customOrder中的数组列表完成的。 从数据库提交的数据必须按照上面的顺序显示在一个列表中,但问题是,只有当来自数据库的数据与这个列表完全匹配时,这才有效,比如如果我有一个确切的单词“ST”或“SIT”,那么它就完成了任务但我从数据库中获取的数据如下所示: ST1、ST2、ST3、SIT1、SIT2、JDC释放、JDC停止、JDC 10 此代码不适用于我的数据,结果中没有错误,但它根本不对数据进行排序 代码如下:如何根据自定义顺序对java列表进行排序,java,sorting,collections,Java,Sorting,Collections,我正在尝试根据自定义顺序对列表进行排序,我已经按照链接进行了操作。 自定义顺序必须如下所示:“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()
只要您提供正确的编撰器
。我看可以。到底是什么不起作用?它是在抛出异常吗?顺序颠倒了吗?我已经准确地更新了问题,但我不知道该怎么做?我刚刚尝试了代码,它运行得很好。非常感谢:-)