每当我在java.lang.ClassCastException中使用treeket.add()方法时,在 "main "线程中出现错误异常。

问题描述 投票:0回答:1

所以,我有这样一个任务,我需要把数据放到一个树集里。我有三个类,它们是:

  1. 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;
    }
    }
    
  2. 家庭类。这个类用于将兄弟对象分配到以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);
    }
    }
    
  3. 最后是主类

        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()时,程序完全正常。这个算法还没有全部完成,但当我尝试运行它时,我发生了这种情况,我无法继续下一步。之前谢谢你。

java collections treeset
1个回答
1
投票

你使用Set而不是List是因为你想避免重复。要知道哪些兄弟是重复的,TreeSet需要一个比较器,或者对象本身需要实现Comparable。

阅读TreeSet的javadoc了解更多。https:/docs.oracle.comjavase7docsapijavautilTreeSet.html。

另外,getInstance总是返回同一个实例。你可能需要把它改成createInstance或者其他能够实际创建新的实例的方法。


0
投票

我同意@GreyFairer的观点,你必须提供一个比较器才能使用Set,参见这个例子。

使用TreeSet的类投异常问题

希望能帮到你!


0
投票

我看有几个问题。

  1. 你已经定义了 Brother 作为一个单子。这意味着只有一个 Brother 实例将存在于你的程序中。所以所有对 Brother 将指向同一个实例。我会避免在这个类中使用singleton,因为这没有意义。
  2. 如果你想使用一个 TreeSet (不提供树的比较者),那么...。Brother 必须实施 Comparable
  3. 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}]}

© www.soinside.com 2019 - 2024. All rights reserved.