大家好,所以我有这个任务,我需要实现接口来遍历ArrayList并对其进行排序(升序或降序)。我不想要“答案”我只需要一些关于我的方法的建议以及为什么我得到这个错误
Exception in thread "main" java.lang.ClassCastException: Week7.Check cannot be cast to java.lang.Comparable
at java.util.Arrays.mergeSort(Unknown Source)
at java.util.Arrays.sort(Unknown Source)
at java.util.Collections.sort(Unknown Source)
at Week7.TestCheck.main(TestCheck.java:18)
我就这样做了:
可比较有一种名为public int compairTo(Object o)
的方法:
public class Check implements comparable {
private Integer checkNumber;
public Check(Integer newCheckNumber) {
setCheckNumber(newCheckNumber);
}
public String toString() {
return getCheckNumber().toString();
}
public void setCheckNumber(Integer checkNumber) {
this.checkNumber = checkNumber;
}
public Integer getCheckNumber() {
return checkNumber;
}
@Override
public int compairTo(Object o) {
Check compair = (Check) o;
int result = 0;
if (this.getCheckNumber() > compair.getCheckNumber())
result = 1;
else if (this.getCheckNumber() < compair.getCheckNumber())
result = -1;
return result;
}
}
在我的主要内容中我有这个
import java.util.ArrayList;
import java.util.Collections;
public class TestCheck {
public static void main(String[] args) {
ArrayList checkList = new ArrayList();
checkList.add(new Check(445));
checkList.add(new Check(101));
checkList.add(new Check(110));
checkList.add(new Check(553));
checkList.add(new Check(123));
Collections.sort(checkList);
for (int i = 0; i < checkList.size(); i++) {
System.out.println(checkList.get(i));
}
}
}
答案 0 :(得分:7)
来吧 - Java区分大小写。 “可比”与“可比”不一样
public class Check implements comparable
拼写也很重要。 “compairTo”与“compareTo”
的方法不同@Override
public int compairTo(Object o) {
答案 1 :(得分:2)
我猜你实现的界面可比较不是界面 java.lang.Comparable ,他们的名字可能是相同的,但包裹?
答案 2 :(得分:1)
要使用Comparator
(使用两个参数调用的内容),必须将其作为参数传递给Collections.sort
方法。
像这样:
Collections.sort( checkList, new Comparator<Check>() {
public int compare( Check one, Check two ) {
return one.getCheckNumber() - two.getCheckNumber();
}
});
这就是它的样子:
import java.util.List;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Collections;
public class Check {
private final Integer checkNumber;
public Check(Integer newCheckNumber) {
this.checkNumber = newCheckNumber;
}
public Integer getCheckNumber() {
return this.checkNumber;
}
public static void main( String [] args ) {
List<Check> list = new ArrayList<Check>();
list.add(new Check(445));
list.add(new Check(101));
list.add(new Check(110));
list.add(new Check(553));
list.add(new Check(123));
Collections.sort( list, new Comparator<Check>() {
public int compare( Check one, Check two ){
return one.getCheckNumber() - two.getCheckNumber();
}
});
for( Check item : list ) {
System.out.println( item.getCheckNumber() );
}
}
}
答案 3 :(得分:0)
实现接口时,必须使用接口提供的方法签名,与接口中定义的方法签名完全相同:
public int compareTo(Object o)
另外,您可能希望参数化列表,例如。 List<Comparable>
和比较例如。使用泛型的Comparable<Check>
是一种编译时技术,可以识别你的拼写错误
答案 4 :(得分:0)
传递给Arrays.sort()
的任何内容都必须实现Comparable
,这是一个java系统接口。你可能想扔掉comparable
。
答案 5 :(得分:0)
[...并且]为什么我收到此错误
致电时:
Collections.sort(checkList);
在第18行中,该方法期望您的元素实现Comparable
(以便能够比较它们)您可能不知道这一点,但它是如何工作的(如documentation中所指定的)
列表中的所有元素都必须实现Comparable接口
然后该方法运行,它会尝试将您的对象“强制转换”为类型Comparable
,因为您的类没有实现它,它会抛出ClassCastException
为了更好地理解这一点,请尝试以下代码:
class Some {
}
class Test {
public static void main( String [] args ) {
Runnable r = ( Runnable ) new Some();
}
}
如果你分析这行,你可能会认为“你为什么试图从某些人那里分配一个Runnable?他们没有关联!”
你是对的,让我们看看输出:
$ java Test
Exception in thread "main" java.lang.ClassCastException: Some cannot be cast to java.lang.Runnable
at Test.main(A.java:5)
相同的错误消息。你可以看一下第5行并看看演员表。
这正是Collections.sort
方法中发生的事情,但是Comparable