gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 13:28:34 25 4
gpt4 key购买 nike

我正在尝试根据自定义顺序对列表进行排序,我已经遵循了 stackOverflow关联。自定义顺序必须如下所示:“ST、SIT、JDC”,这是通过 customOrder 中的数组列表完成的。来自数据库的数据必须按照上述顺序显示在列表中,但问题是,只有当数据库中的数据与此列表完全匹配时,这才有效,就像我有一个确切的单词“ST”或“坐”然后它就完成了工作。 但是我从数据库获取的数据如下所示:

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;
}
});

最佳答案

问题是,您没有定义 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;
}
}

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

关于java - 如何根据自定义顺序对 java 列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21682553/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com