早上好!
我正在尝试按两个字段比较列表,但结果不起作用,您能帮我吗?
我有一个示例列表:
Name - MesesDuracao - Buy
A - 1 - 10
A - 2 - 5
B - 1 - 8
我希望订购显示如下:
A-1-10
B-1-8
A-2-5
我正在尝试这种方式:
Collections.sort (testImportados, new Comparator <BeanRelEstatisticaMateriaPrima> () {
@Override
public int compare (BeanRelEstatisticaMateriaPrima p1, BeanRelEstatisticaMateriaPrima p2)
{
int comparison = p1.getMesesduration (). compareTo (p2.getMesesduration ());
return comparison == 0? p1.getQtyBuy (). compareTo (p2.getQtyBuy ()): comparison;
}
});
但是,它仅按“ getMesesduration()”进行排序,而不按购买的数量进行排序。
有什么建议吗?
谢谢
答案 0 :(得分:3)
Collections.sort(
testImportados,
Comparator.comparing(BeanRelEstatisticaMateriaPrima::getMesesduration)
.thenComparing(BeanRelEstatisticaMateriaPrima::getQtyBuy));
如果已经使用了Java-8,它应该是提供正确的Comparator
的最简单方法。
答案 1 :(得分:0)
我不明白您的方法。
getQtyComprar()
能做什么? getQtyBuy()
会做什么?我认为两种方法是不同的。但是,您正在比较器中比较两个不同的方法调用为p1.getQtyComprar().compareTo(p2.getQtyBuy ())
。因此,您最后的Comparator
应该采用相同的方法用法表格。
如果您想在第一次比较后比较getQtyComprar
,则代码应类似于;
Collections.sort (testImportados, new Comparator <BeanRelEstatisticaMateriaPrima> () {
@Override
public int compare (BeanRelEstatisticaMateriaPrima p1, BeanRelEstatisticaMateriaPrima p2)
{
int comparison = p1.getMesesduration (). compareTo (p2.getMesesduration ());
return comparison == 0? p1.getQtyComprar (). compareTo (p2.getQtyComprar()): dateComparison;
}
});
如果您想在第一次比较后比较getQtyBuy
,则代码应类似于;
Collections.sort (testImportados, new Comparator <BeanRelEstatisticaMateriaPrima> () {
@Override
public int compare (BeanRelEstatisticaMateriaPrima p1, BeanRelEstatisticaMateriaPrima p2)
{
int comparison = p1.getMesesduration().compareTo(p2.getMesesduration());
return comparison == 0? p1.getQtyBuy().compareTo (p2.getQtyBuy()): dateComparison;
}
});
由于我的帖子,请仔细选择您的比较方法。
答案 2 :(得分:0)
我认为您想首先按数量排序,然后按持续时间排序。
Collections.sort (testImportados, new Comparator <BeanRelEstatisticaMateriaPrima> () {
@Override
public int compare (BeanRelEstatisticaMateriaPrima p1, BeanRelEstatisticaMateriaPrima p2) {
// first sort by quantity
int cmp = Integer.compare(p1.getQtyBuy(), p2.getQtyBuy());
// the quantities are the same, then sort by duration
if (cmp == 0) {
cmp = p1.getMesesDuration().compareTo(p2.getMesesDuration());
}
return cmp;
}
答案 3 :(得分:0)
我忘了提一下,我在getQtyBuy
中有一个负值,看起来代码已经丢失了。
我尝试了其他代码:
public class CustomerSortingComparator implements Comparator < BeanRelEstatisticaMateriaPrima > {
@Override
public int compare(BeanRelEstatisticaMateriaPrima cust1, BeanRelEstatisticaMateriaPrima cust2) {
// all comparison
int compareMes = cust1.getMesesduration().compareTo(cust2.getMesesduration());
int compareBuy = cust1.getQtyBuy().compareTo(cust2.getQtyBuy());
int compareName = cust1.getProdname().compareTo(cust2.getProdname());
// 3-level comparison using if-else block
if (compareMes == 0) {
return ((compareBuy == 0) ? compareName : compareBuy);
} else {
return compareMes;
}
}
}
Collections.sort(testImportados, new CustomerSortingComparator());
仅按一个参数getMesesduration()
继续排序
我不明白。