0

我正在尝试根据每个对象中 long 的值对 ArrayList 进行排序。在遵循互联网上的各种示例之后,我提出了以下代码,但它没有按预期排序(它似乎截断了对象的某些部分)。

public static Comparator<Customer> compareSIN = 
         new Comparator<Customer>() {
            public int compare(Customer cust1, Customer other) {
               String sin1 = "" + cust1.sin;
               String sin2 = "" + other.sin;
               return sin1.compareTo(sin2);
            }
         };

请告诉我我在第一个代码片段中缺少什么,这会阻止我正确排序对象。

谢谢!

4

3 回答 3

3

从我假设的标题Customer.sinlong- 问题是你试图将它们作为Strings 而不是通过它们的数值进行比较。

(例如: 10000 在字典上小于 2 - 所以String在这里使用 s 是错误的)

您应该使用Long.compare()(假设 java 7):

public static Comparator<Customer> compareSIN = 
         new Comparator<Customer>() {
            public int compare(Customer cust1, Customer other) {
               return Long.compare(cust1.sin,other.sin);
            }
         };
于 2012-10-22T22:48:44.633 回答
2

您实际上不需要compareTo()在自己的方法中使用compareTo()方法。

比较声明如果它们相等则必须返回 0,如果不相等则必须返回负数或正数。

出于这个原因,您可以通过返回从另一个中减去的一个来比较两个 long。

public int compare(Customer cust1, Customer other) {
           return cust1.sin - other.sin;
}

如您所见,如果它们相等则返回 0,如果 other.sin 大于 cust1.sin 则返回负数,如果cust1.sin大于other.sin返回正数。

于 2012-10-22T22:48:19.573 回答
0

你比较Strings 而不是longs。

因此,假设您想比较:“10”和“5”,结果将是“10”<“5”,而认为您正在使用long,您希望得到10 > 5 ...

这可以解释你的问题。

于 2012-10-22T22:54:00.517 回答