Java Collections.sort不调用compare方法

Mmt*_*Bkn 1 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);
    }
});
Run Code Online (Sandbox Code Playgroud)

Invoice类的某些部分.

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

public String CustomerId;

public String InvoiceNumber;
Run Code Online (Sandbox Code Playgroud)

更多代码的图片. 是啊.

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

我正在使用android studio和最新的库.有什么我想念的吗?

Gra*_*ray 6

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

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

我怀疑你的问题在这里:

public String InvoiceNumber;
Run Code Online (Sandbox Code Playgroud)

首先,字段名称应该是invoiceNumber一个起始小写字母.此外,它大概应该不会是公开的数据隐藏的原因.

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

1
2
3
10
11
20
25
114
201
Run Code Online (Sandbox Code Playgroud)

然后这些将类似于:

1
10
11
114
2
20
25
201
3
Run Code Online (Sandbox Code Playgroud)

这就是该String.compare(...)方法对它进行排序的原因,因为字符串"3"大于字符串"201".如果您希望将它们按数字排序,那么您应该将该invoiceNumber字段设为intlong.

希望这可以帮助.