Java Collections.sort不会调用compare方法

时间:2017-04-25 19:50:09

标签: java sorting collections

我已经阅读了所有答案等,但没有解决我的问题。

我有基本功能来按字符串InvoiceNumber对自定义对象数组列表进行排序。

List<Invoice> invoiceList = new ArrayList<>();

...
// invoiceList filled here
...

Collections.sort(invoiceList, new Comparator<Invoice>()
{
    @Override
    public int compare(Invoice o1, Invoice o2)
    {
           return o1.InvoiceNumber.compareTo(o2.InvoiceNumber);
    }
});

Invoice类的某些部分。

public class Invoice extends AttributeContainer
implements KvmSerializable,android.os.Parcelable, Comparable
{

public String CustomerId;

public String InvoiceNumber;

Picture of more code. Yea.

但是,它从不调用比较方法。

我使用android studio和最新的库。我有什么遗失的吗?

2 个答案:

答案 0 :(得分:6)

  

但是,它从不调用比较方法。

如果您的列表中包含0或1个项目,则唯一不会调用compare(...)方法的时间。可能这是Android的调试问题,而compare(...) 正在调用,但可能正在跳过断点。在方法中放入某种日志消息将证实这一点。

我怀疑你的问题在这里:

public String InvoiceNumber;

首先,字段名称应为invoiceNumber,并带有一个小写字母。 也可能因data hiding原因而公开。

但我怀疑真正的问题在于String数字的比较。例如,如果您的实体中包含以下发票编号字符串:

1
2
3
10
11
20
25
114
201

然后这些就像:

1
10
11
114
2
20
25
201
3

String.compare(...)方法如何对其进行排序,因为字符串"3"大于字符串"201"。如果您希望将它们按数字排序,则应将invoiceNumber字段设为intlong

希望这有帮助。

答案 1 :(得分:0)

sort方法创建匿名类时,我遇到了同样的问题。尝试提取您的Comparator类,您将可以进行调试。