所以,我有这样一个任务,我需要把数据放到一个树集里。我有三个类,它们是:
Brother.java.Break.Break.java。任务中说构造函数不是公共的,所以我使用getInstance()来初始化Brother对象。
public class Brother {
String name;
int day;
int month;
private static Brother instance = null;
private Brother()
{
name = "0";
day = 0;
month = 0;
}
public static Brother getInstance()
{
if(instance == null)
{
instance = new Brother();
}
return instance;
}
}
家庭类。这个类用于将兄弟对象分配到以Brother为对象的树集中。
import java.util.Set;
import java.util.TreeSet;
public class Family {
Set<Brother> Brothers;
public Family()
{
this.Brothers = new TreeSet<Brother>();
}
public Brother makeBrother()
{
Brother B = Brother.getInstance();
return B;
}
public boolean addBrother(String name, int day, int month)
{
Brother B = Brother.getInstance();
return Brothers.add(B);
}
}
最后是主类
public class Main {
public static void main(String[] args) {
Family myFamily = new Family();
myFamily.makeBrother();
// myFamily.addBrother("Shane", 3, 2);
}
}
每当我尝试使用myFamily.addBrother()时,我总是得到这个错误 "Exception in thread "main" java.lang.ClassCastException: class Brother cannot be cast to class java.lang.Comparable (Brother is in unnamed module of loader 'app'; java.lang.Comparable is in module java.base of loader 'bootstrap')"。我有什么办法?当我使用myFamily.makeBrother()时,程序完全正常。这个算法还没有全部完成,但当我尝试运行它时,我发生了这种情况,我无法继续下一步。之前谢谢你。
你使用Set而不是List是因为你想避免重复。要知道哪些兄弟是重复的,TreeSet需要一个比较器,或者对象本身需要实现Comparable。
阅读TreeSet的javadoc了解更多。https:/docs.oracle.comjavase7docsapijavautilTreeSet.html。
另外,getInstance总是返回同一个实例。你可能需要把它改成createInstance或者其他能够实际创建新的实例的方法。
我看有几个问题。
Brother
作为一个单子。这意味着只有一个 Brother
实例将存在于你的程序中。所以所有对 Brother
将指向同一个实例。我会避免在这个类中使用singleton,因为这没有意义。TreeSet
(不提供树的比较者),那么...。Brother
必须实施 Comparable
Family.makeBrother
只需返回单体 Brother
但并没有将其添加到家族树中,这就是为什么你没有得到错误的原因。这是你的代码的工作重做
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;
public class FamilyTreeSet {
public static void main(String[] args) {
Family myFamily = new Family();
myFamily.addBrother("Shane", 3, 2);
myFamily.addBrother("Bob", 2, 4);
System.out.println(myFamily);
}
public static class Brother implements Comparable<Brother>{
private String name;
private int day;
private int month;
public Brother(String name, int day, int month) {
this.name = name;
this.day = day;
this.month = month;
}
public String getName() {
return name;
}
public int getDay() {
return day;
}
public int getMonth() {
return month;
}
@Override
public int compareTo(Brother o) {
return Comparator.comparing(Brother::getName, String.CASE_INSENSITIVE_ORDER).compare(this, o);
}
@Override
public String toString() {
return "Brother{" +
"name='" + name + '\'' +
", day=" + day +
", month=" + month +
'}';
}
}
public static class Family {
Set<Brother> Brothers;
public Family()
{
this.Brothers = new TreeSet<Brother>();
}
public boolean addBrother(String name, int day, int month)
{
Brother B = new Brother(name, day, month);
return Brothers.add(B);
}
@Override
public String toString() {
return "Family{" +
"Brothers=" + Brothers +
'}';
}
}
}
我是用每个兄弟的名字来比较兄弟。检查我首先添加了Shane,但在输出中Bob却在前面。如果你想用生日来比较兄弟,只需更改compareTo。Family{Brothers=[Brother{name='Bod', day=2, month=4}, Brother{name='Shane', day=3, month=2}]}