java 排序中的可比较界面
java comparable interface in sorting
我在集合中想到的问题是使用可比界面构建我自己的默认排序顺序。我只想根据 eid
降序排列 (int eid,String ename)
。所以这是我在comapreTo
方法中无法理解的逻辑。
public class First implements Comparable<First> {
private final int eId;
private final String eName;
public First(int eId, String eName){
this.eId = eId;
this.eName = eName;
}
public int getEId() {
return eId;
}
public String toString(){
return eName + "------" + eId;
}
public int compareTo(First obj){
int eId1 = this.eId;
First f = (First) obj;
int eId2 = f.eId;
if (eId1 < eId2){
return -1;
} else if (eId1 > eId2){
return +1;
} else {
return 0;
}
}}
请解释这是如何工作的,还有其他实现方式吗?
equals 方法和 ==
和 !=
运算符测试 equality/inequality,但不提供测试相对值的方法。一些 classes(例如,String 和其他具有自然排序的 classes)实现了 Comparable 接口,该接口定义了 compareTo
方法。如果您想将 Comparable<T>
与 Collections.sort()
或 Arrays.sort()
方法一起使用,则需要在 class 中实现它。
你的比较方法欠缺,一个合适的例子是:
public int compareTo(First other){
if (eId < other.getEId()){
return -1;
} else if (eId > other.getEId()){
return +1;
} else {
return 0;
}
}
通过输入 Comparable 界面,您可以知道比较的是哪种数据。这确保了正确的比较。您的示例可以 运行 很快变成 NullPointerException
。
please explain how this works
我猜你的问题基本上是,
Why do I need to implement the comparable interface to sort a list?
要对列表进行排序,您首先需要告诉 Java 如何比较两个对象。这样,Java就可以判断出哪个对象是"less",哪个对象是"greater"。使用此信息,然后可以按升序或降序对列表进行排序。
如何判断Java哪个大哪个小?
如果this
大于other
参数,return 1.如果this
小于other
参数,return -1。否则,return 0.
is there any other way of implementation?
实际上,您当前的 compareTo
方法无法编译。更好的实施方式是:
public int compareTo(First other){
return Integer.compare(this.getEId(), other.getEId());
}
因为我还没有看到你对问题中提出的部分表示理解"how it works",所以我想你可能对此还不太清楚。根据您在某些答案中的评论,我发现您也不理解某些代码背后的 "logic" 。
我们将以 Mark Rotteveel 给出的示例来解释逻辑,因为我认为这是实现 compareTo
的一种不错的方式。
public int compareTo(First other){
if (eId < other.getEId()){
return -1;
} else if (eId > other.getEId()){
return +1;
} else {
return 0;
}
}
我们让方法 compareTo
接收一个参数,该参数是类型 First
的对象 - 即您创建的 class。此类型包括您在此 class 中包含的所有属性,例如,有一个 getEId
方法允许您 return 您在您的文件中找到的私有全局变量 eId
class First
。
现在问题是 compareTo
中的这个 other
参数是 First
对象的 自己的实例 ,而不是相同的您在 compareTo
方法内部比较的一个(这部分:if (eId < other.getEId())
)。
在 compareTo
方法中,我们使用 if-else 语句来检查 eId
(指的是您当前的全局变量 eId
)是否为 eId
是为作为参数传递给 compareTo
方法的 First
对象创建的。所以这两个不是同一个值.
正如您所说,您是编程新手,您可以这样想,您制作了一个具有构造函数的 class First
:
public First(int eId, String eName){
this.eId = eId;
this.eName = eName;
}
然后您可以制作两个 不同的 First
对象:
First obj1 = new First(5, "Object 1");
First obj2 = new First(12, "Object 2");
在此示例中,obj1
和 obj2
不是 同一对象,并且本质上具有不同的 eId
值。例如,您传递给 compareTo
方法的那个可能是 obj2
,这将不同于它当前正在比较的 eId。
所以当我们将 obj2
传递给这样的方法时 compareTo(obj2)
,这意味着当它到达读取 other.getEId
的代码部分时,它将执行 obj2.getEId
这显然 return 与 if 语句中的 eId
不同 eId
。在此示例中,'obj2.getEId
' 它将 return 整数 12,因为如您所见,我之前将 obj2
的 eId
设置为 12。
if-else 语句中的其余代码非常简单,如果您当前正在比较的 eId
的整数值较小,return -1
,else if
更大 return +1
将其向上或向下移动以根据 eId
对它们进行排序。 Return 在任何其他情况下为 0,因为在那种情况下它们在 eId
.
方面是相等的
我希望从事物背后的逻辑以及 compareTo
中比较的 eId
的实例有何不同的角度来澄清代码。
我在集合中想到的问题是使用可比界面构建我自己的默认排序顺序。我只想根据 eid
降序排列 (int eid,String ename)
。所以这是我在comapreTo
方法中无法理解的逻辑。
public class First implements Comparable<First> {
private final int eId;
private final String eName;
public First(int eId, String eName){
this.eId = eId;
this.eName = eName;
}
public int getEId() {
return eId;
}
public String toString(){
return eName + "------" + eId;
}
public int compareTo(First obj){
int eId1 = this.eId;
First f = (First) obj;
int eId2 = f.eId;
if (eId1 < eId2){
return -1;
} else if (eId1 > eId2){
return +1;
} else {
return 0;
}
}}
请解释这是如何工作的,还有其他实现方式吗?
equals 方法和 ==
和 !=
运算符测试 equality/inequality,但不提供测试相对值的方法。一些 classes(例如,String 和其他具有自然排序的 classes)实现了 Comparable 接口,该接口定义了 compareTo
方法。如果您想将 Comparable<T>
与 Collections.sort()
或 Arrays.sort()
方法一起使用,则需要在 class 中实现它。
你的比较方法欠缺,一个合适的例子是:
public int compareTo(First other){
if (eId < other.getEId()){
return -1;
} else if (eId > other.getEId()){
return +1;
} else {
return 0;
}
}
通过输入 Comparable 界面,您可以知道比较的是哪种数据。这确保了正确的比较。您的示例可以 运行 很快变成 NullPointerException
。
please explain how this works
我猜你的问题基本上是,
Why do I need to implement the comparable interface to sort a list?
要对列表进行排序,您首先需要告诉 Java 如何比较两个对象。这样,Java就可以判断出哪个对象是"less",哪个对象是"greater"。使用此信息,然后可以按升序或降序对列表进行排序。
如何判断Java哪个大哪个小?
如果this
大于other
参数,return 1.如果this
小于other
参数,return -1。否则,return 0.
is there any other way of implementation?
实际上,您当前的 compareTo
方法无法编译。更好的实施方式是:
public int compareTo(First other){
return Integer.compare(this.getEId(), other.getEId());
}
因为我还没有看到你对问题中提出的部分表示理解"how it works",所以我想你可能对此还不太清楚。根据您在某些答案中的评论,我发现您也不理解某些代码背后的 "logic" 。
我们将以 Mark Rotteveel 给出的示例来解释逻辑,因为我认为这是实现 compareTo
的一种不错的方式。
public int compareTo(First other){
if (eId < other.getEId()){
return -1;
} else if (eId > other.getEId()){
return +1;
} else {
return 0;
}
}
我们让方法 compareTo
接收一个参数,该参数是类型 First
的对象 - 即您创建的 class。此类型包括您在此 class 中包含的所有属性,例如,有一个 getEId
方法允许您 return 您在您的文件中找到的私有全局变量 eId
class First
。
现在问题是 compareTo
中的这个 other
参数是 First
对象的 自己的实例 ,而不是相同的您在 compareTo
方法内部比较的一个(这部分:if (eId < other.getEId())
)。
在 compareTo
方法中,我们使用 if-else 语句来检查 eId
(指的是您当前的全局变量 eId
)是否为 eId
是为作为参数传递给 compareTo
方法的 First
对象创建的。所以这两个不是同一个值.
正如您所说,您是编程新手,您可以这样想,您制作了一个具有构造函数的 class First
:
public First(int eId, String eName){
this.eId = eId;
this.eName = eName;
}
然后您可以制作两个 不同的 First
对象:
First obj1 = new First(5, "Object 1");
First obj2 = new First(12, "Object 2");
在此示例中,obj1
和 obj2
不是 同一对象,并且本质上具有不同的 eId
值。例如,您传递给 compareTo
方法的那个可能是 obj2
,这将不同于它当前正在比较的 eId。
所以当我们将 obj2
传递给这样的方法时 compareTo(obj2)
,这意味着当它到达读取 other.getEId
的代码部分时,它将执行 obj2.getEId
这显然 return 与 if 语句中的 eId
不同 eId
。在此示例中,'obj2.getEId
' 它将 return 整数 12,因为如您所见,我之前将 obj2
的 eId
设置为 12。
if-else 语句中的其余代码非常简单,如果您当前正在比较的 eId
的整数值较小,return -1
,else if
更大 return +1
将其向上或向下移动以根据 eId
对它们进行排序。 Return 在任何其他情况下为 0,因为在那种情况下它们在 eId
.
我希望从事物背后的逻辑以及 compareTo
中比较的 eId
的实例有何不同的角度来澄清代码。