我正在尝试针对自定义订单对列表进行排序,我已经按照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;
}
});
答案 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;
}
}
但是会有一些边缘情况,例如重叠前缀等。无论如何,我已经尝试过这段代码,它可以处理您的数据。