我正在compareTo()为一个简单的类实现方法(为了能够使用Collections.sort()和Java平台提供的其他好东西):
public class Metadata implements Comparable<Metadata> {
private String name;
private String value;
// Imagine basic constructor and accessors here
// Irrelevant parts omitted
}
Run Code Online (Sandbox Code Playgroud)
我希望这些对象的自然顺序为:1)按名称排序; 2)如果名称相同则按值排序; 两种比较都应该不区分大小写.对于这两个字段,空值完全可以接受,因此compareTo在这些情况下不得中断.
脑海中出现的解决方案与以下几行相似(我在这里使用"保护条款",而其他人可能更喜欢单个返回点,但这不是重点):
// primarily by name, secondarily by value; null-safe; case-insensitive
public int compareTo(Metadata other) {
if (this.name == null && other.name != null){
return -1;
}
else if (this.name != null && other.name == null){
return 1;
}
else if (this.name != null && …Run Code Online (Sandbox Code Playgroud) 考虑简单的测试类:
import java.math.BigDecimal;
/**
* @author The Elite Gentleman
*
*/
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
BigDecimal x = new BigDecimal("1");
BigDecimal y = new BigDecimal("1.00");
System.out.println(x.equals(y));
System.out.println(x.compareTo(y) == 0 ? "true": "false");
}
}
Run Code Online (Sandbox Code Playgroud)
你可以(有意识地)说它x等于y(不是对象引用),但是当你运行程序时,以下结果显示:
false
true
Run Code Online (Sandbox Code Playgroud)
问:什么是之间的区别compareTo(),并equals()在BigDecimal该compareTo可以确定x等于y?
PS:我看到BigDecimal在inflate()方法上有一个equals()方法.inflate()实际上做了什么?
当String我在Java中测试同等性时,我总是使用它,equals()因为对我来说这似乎是最自然的方法.毕竟,它的名字已经说明了它的目的.然而,我最近告诉我的一位同事被教导用compareTo() == 0而不是equals().这感觉不自然(因为compareTo()它意味着提供一种排序,而不是相等的平等),甚至有点危险(因为compareTo() == 0并不一定意味着在所有情况下都是平等的,即使我知道这对我来说也是如此String).
他不知道为什么他被教导用compareTo()而不是equals()用于String,我也找不到任何理由.这真的是个人品味的问题,还是有任何方法的真正原因?
Java中的枚举实现了Comparable接口.这本来是很好的覆盖Comparable的compareTo方法,但在这里它被标记为最终.Enum's 的默认自然顺序compareTo是列出的顺序.
有谁知道为什么Java枚举有这个限制?
写作更好吗?
int primitive1 = 3, primitive2 = 4;
Integer a = new Integer(primitive1);
Integer b = new Integer(primitive2);
int compare = a.compareTo(b);
Run Code Online (Sandbox Code Playgroud)
要么
int primitive1 = 3, primitive2 = 4;
int compare = (primitive1 > primitive2) ? 1 : 0;
if(compare == 0){
compare = (primitive1 == primitive2) ? 0 : -1;
}
Run Code Online (Sandbox Code Playgroud)
我认为第二个更好,应该更快,更多的内存优化.但他们不是一样的吗?
我正在研究OpenJDK的来源.
我的注意力被这些方法所吸引,Byte.compare()并且Integer.compare():
public static int Byte.compare(byte x, byte y) {
return x-y;
}
public static int Integer.compare(int x, int y) {
return (x < y) ? -1 : ((x == y) ? 0 : 1);
}
Run Code Online (Sandbox Code Playgroud)
该方法为什么Byte.compare()而Integer.compare()有不同的实现?
我知道这已经有一段时间了,并且检查了我以前得到的所有答案,但是这个仍然不起作用.
对象'船员'代表有船员和其他物品的船员.比较应该通过比较'assigned_rank',一个int值,如果这两个实例中的值相等,那么'is_trainer',一个布尔值,应该有所不同.
只要它运行java <7,这种方法就很有效.但是从Java 7开始我就得到了这个:
java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.ComparableTimSort.mergeLo(ComparableTimSort.java:714)
at java.util.ComparableTimSort.mergeAt(ComparableTimSort.java:451)
at java.util.ComparableTimSort.mergeCollapse(ComparableTimSort.java:376)
at java.util.ComparableTimSort.sort(ComparableTimSort.java:182)
at java.util.ComparableTimSort.sort(ComparableTimSort.java:146)
at java.util.Arrays.sort(Arrays.java:472)
at java.util.Collections.sort(Collections.java:155)
at dormas_flightlog.Query.getCrew(Query.java:714)
Run Code Online (Sandbox Code Playgroud)
这是源代码,其中一些有潜在危险的部分已经被评论过,但它仍然不起作用:
public class crew implements Serializable, Comparable<crew> {
private static final long serialVersionUID = 36L;
private int flightID = 0;
private int assigned_rank = 25;
private boolean is_trainer = false;
...
@Override
public int compareTo(crew him) {
int myRank = this.getAssigned_rank();
int hisRank = him.assigned_rank;
if (this == him) {
return 0; …Run Code Online (Sandbox Code Playgroud) 我正在学习数组,基本上我有一个收集姓氏,名字和分数的数组.
我需要编写一个compareTo方法来比较姓氏和名字,以便列表可以按字母顺序从姓氏开始排序,然后如果两个人的姓氏相同,那么它将对第一个名称进行排序.
我很困惑,因为我书中的所有信息都是比较数字,而不是对象和字符串.
这是我到目前为止编码的内容.我知道这是错的,但它至少解释了我认为我在做什么:
public int compare(Object obj) // creating a method to compare
{
Student s = (Student) obj; // creating a student object
// I guess here I'm telling it to compare the last names?
int studentCompare = this.lastName.compareTo(s.getLastName());
if (studentCompare != 0)
return studentCompare;
else
{
if (this.getLastName() < s.getLastName())
return - 1;
if (this.getLastName() > s.getLastName())
return 1;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我知道<和>符号是错误的,但就像我说我的书只告诉你如何使用compareTo.
以下小测试抛出NPE:
public class Test {
public static void main(String[] args) {
String a = "a";
String b = null;
System.out.println(a.compareTo(b));
}
}
Run Code Online (Sandbox Code Playgroud)
然而,compareTo()的Javadoc 没有提到参数不能null.这很奇怪,因为Javadocs通常会提到参数不可用的时候null.
这只是文档中的一个小故障还是有一个更基本的原因/扭曲我错过了?
我可以使用它按emp id排序,但我不确定是否可以比较字符串.我得到一个错误,操作符未定义为字符串.
public int compareTo(Emp i) {
if (this.getName() == ((Emp ) i).getName())
return 0;
else if ((this.getName()) > ((Emp ) i).getName())
return 1;
else
return -1;
Run Code Online (Sandbox Code Playgroud) compareto ×10
java ×9
comparable ×3
equals ×2
null ×2
string ×2
bigdecimal ×1
comparison ×1
enums ×1
java-7 ×1
performance ×1
refactoring ×1