【问题标题】:Sorting ArrayList Based on Value of Long根据 Long 的值对 ArrayList 进行排序
【发布时间】:2012-10-22 22:44:42
【问题描述】:

我正在尝试根据每个对象中 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);
            }
         };

请告知我在第一个 sn-p 代码中遗漏了什么,这使我无法正确排序对象。

谢谢!

【问题讨论】:

    标签: java sorting collections arraylist


    【解决方案1】:

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

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

    你应该使用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);
                }
             };
    

    【讨论】:

    • 谢谢,你能澄清一下 Long.compare() 的语法吗?
    • 为什么要使用 Long.compare() 而不是简单的减法?我很好奇。
    • @JonTaylor:主要是可读性 - Long.compare(x,y) 然后减法(从第一次看)更清楚。而且它通常更易于维护。
    • 当 compareTo 方法的返回值为 int 时,长减法不起作用。编译器会抱怨精度损失。有道理,因为减去的值可能会溢出整数。
    • @JonTaylor:请参阅 Kal 关于减法错误原因的见解。这正是在可能的情况下更喜欢内置库的原因 - 有人已经考虑过我们不考虑的任何事情。
    【解决方案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

    【讨论】:

    • 我认为他想将它们作为字符串进行比较...如果我没记错的话
    • 我认为他正在转换为字符串,因为它有一个 compareTo 方法可用。根据他的标题和描述,他想比较长值。比较字符串表示会达到什么目的?
    • 没什么我的口味,但我认为他是出于某种目的而转换为 String
    • @foampile 我只转换为字符串,因为 .compareTo 不适用于 long 并且由于某种原因,我没有想到减法。
    • 查看@Kal 提供的关于我的回答为什么天真的减法有问题的评论
    【解决方案3】:

    您比较Strings 而不是longs。

    所以,假设您想比较:“10”和“5”,结果将是 "10" ,而认为您正在使用 long,您期望得到 10 > 5 ...

    这可以解释你的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-01
      • 1970-01-01
      • 2015-11-07
      • 2011-08-19
      • 1970-01-01
      • 1970-01-01
      • 2017-07-06
      • 2013-05-13
      相关资源
      最近更新 更多