Java 基于Long值对ArrayList进行排序

Java 基于Long值对ArrayList进行排序,java,sorting,collections,arraylist,Java,Sorting,Collections,Arraylist,我正在尝试根据每个对象中的long present值对ArrayList进行排序。在遵循了internet上的各种示例之后,我提出了以下代码,但它并没有按照所需排序(它似乎截断了对象的一部分) 公共静态比较器比较器in= 新比较器(){ 公共整数比较(客户客户1,客户其他){ 字符串sin1=“”+cust1.sin; 字符串sin2=“”+其他.sin; 返回sin1.compareTo(sin2); } }; 请告诉我在第一段代码中缺少的阻止我正确排序对象的操作 谢谢 您实际上不需要在自己

我正在尝试根据每个对象中的long present值对ArrayList进行排序。在遵循了internet上的各种示例之后,我提出了以下代码,但它并没有按照所需排序(它似乎截断了对象的一部分)

公共静态比较器比较器in=
新比较器(){
公共整数比较(客户客户1,客户其他){
字符串sin1=“”+cust1.sin;
字符串sin2=“”+其他.sin;
返回sin1.compareTo(sin2);
}
};
请告诉我在第一段代码中缺少的阻止我正确排序对象的操作


谢谢

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

compare to声明,如果它们相等,则必须返回0,如果它们是负数或正数,则表示不相等

因此,您可以通过返回从另一个减去的一个来比较两个long

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

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

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

compare to声明,如果它们相等,则必须返回0,如果它们是负数或正数,则表示不相等

因此,您可以通过返回从另一个减去的一个来比较两个long

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

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

从标题中我假设
Customer.sin
是一个
long
——问题是您试图将它们作为
字符串进行比较,而不是按数值进行比较

(例如:10000在字典上比2小-因此使用
String
s这里是错误)

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

公共静态比较器比较器in=
新比较器(){
公共整数比较(客户客户1,客户其他){
返回长。比较(cust1.sin,other.sin);
}
};

从标题中,我假设
Customer.sin
是一个
长的
——问题是您试图将它们作为
字符串
进行比较,而不是按照它们的数值进行比较

(例如:10000在字典上比2小-因此使用
String
s这里是错误)

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

公共静态比较器比较器in=
新比较器(){
公共整数比较(客户客户1,客户其他){
返回长。比较(cust1.sin,other.sin);
}
};

比较
字符串
s而不是
s

所以,假设你想比较:“10”和“5”,结果将是“10”<“5”,而认为你正在使用
长的
,你希望得到10>5


这可以解释你的问题。

你比较的是
String
s而不是
long
s

所以,假设你想比较:“10”和“5”,结果将是“10”<“5”,而认为你正在使用
长的
,你希望得到10>5



这可以解释你的问题。

我想他想把它们作为字符串进行比较。。。如果我没弄错的话,我想他是在转换字符串,因为它有一个compareTo方法。从他的标题和描述中,他想比较长期价值观。比较字符串表示法会有什么效果呢?我觉得没什么,但我认为他是在某种程度上转换成字符串的purpose@foampile我之所以转换为字符串,是因为.compareTo不适用于long,而且由于某些原因,我没有想到减法。请看@Kal对我的答案的评论,为什么天真的减法有问题?我想他想把它们作为字符串来比较。。。如果我没弄错的话,我想他是在转换字符串,因为它有一个compareTo方法。从他的标题和描述中,他想比较长期价值观。比较字符串表示法会有什么效果呢?我觉得没什么,但我认为他是在某种程度上转换成字符串的purpose@foampile我之所以转换为字符串,是因为.compareTo不适用于long,而且由于某些原因,我没有想到减法。请看@Kal对我的答案的评论,为什么天真的减法是有问题的。谢谢,你能澄清一下长时间的语法是什么吗。compare()?为什么在简单的减法中使用Long.compare()?我很好奇。@JonTaylor:主要是可读性,
的长度更清晰。比较(x,y)
做减法(从第一眼看)。此外,它通常更易于维护。当compareTo方法的返回值为int时,长减法不起作用。编译器会抱怨精度降低。有道理,因为减去的值可能会溢出整数。@JonTaylor:请参阅Kal关于减法错误原因的见解。这正是在可能的情况下选择内置库的原因-有人已经想到了我们不需要的东西。谢谢,你能澄清一下Long.compare()的语法吗?为什么要使用Long.compare()而不是简单的减法?我很好奇。@JonTaylor:主要是可读性,
的长度更清晰。比较(x,y)
做减法(从第一眼看)。此外,它通常更易于维护。当compareTo方法的返回值为int时,长减法不起作用。编译器会抱怨精度降低。有道理,因为减去的值可能会溢出整数。@JonTaylor:请参阅Kal关于减法错误原因的见解。这正是公关的理由
public static Comparator<Customer> compareSIN = 
         new Comparator<Customer>() {
            public int compare(Customer cust1, Customer other) {
               return Long.compare(cust1.sin,other.sin);
            }
         };