【问题标题】:can't convert hashset to treeset with object collection无法使用对象集合将哈希集转换为树集
【发布时间】:2016-01-11 11:10:03
【问题描述】:

我必须将 Hashset 转换为 TreeSet,但我有错误

// Here, All is ok, Chien is an object.
Set<Chien> animaux = new HashSet<Chien>();
animaux.add(new Chien("non", 10));
animaux.add(new Chien("zoz", 15));
animaux.add(new Chien("non", 10));

// And then i have to convert it to TreeSet 
// IntellJ-Idead says me that's ok...
// But i have an error here
TreeSet<Chien> treseet = new TreeSet<Chien>(animaux);

但是当我尝试编译时:

Exception in thread "main" java.lang.ClassCastException: fr.univtln.arouani277.vertebre.animal.Chien cannot be cast to java.lang.Comparable
    at java.util.TreeMap.put(TreeMap.java:559)
    at java.util.TreeSet.add(TreeSet.java:255)
    at java.util.AbstractCollection.addAll(AbstractCollection.java:322)
    at java.util.TreeSet.addAll(TreeSet.java:312)
    at java.util.TreeSet.<init>(TreeSet.java:160)
    at fr.univtln.arouani277.App.main(App.java:40)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:622)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

这是我的文件Chien

public class Chien extends Mammifere implements Ibruit {
    public Chien(String pnom, int page) {
        super(pnom, page);
    }

    public void aboyer() {
        System.out.println("ouaf");
    }

    public void crier() {
        System.out.println("ouaf");
    }
}

它扩展了Mammifere

public abstract class Mammifere extends Animal {
    public Mammifere(String pnom, int page) {
        super(pnom, page);
    }
}

这扩展了Animal

public abstract class Animal extends Vertebre {
    public Animal(String nom, int page) {
        super(nom, page);
    }

    public void aboyer() {
    }

    public String toString() {
        System.out.println("Je suis un animal");
        return super.toString();
    }
}

扩展 Vertebrehttp://pastebin.com/Aa4Rw8sW

【问题讨论】:

    标签: java collections set hashset treeset


    【解决方案1】:

    HashSet 不同,TreeSet 依赖于排序,因此它可以快速确定是否存在重复项。当您将HashSet 传递给TreeSet constructor 时,它会发现您的Chien 对象不是Comparable

    构造一个包含指定集合中元素的新树集,根据其元素的自然顺序排序。插入集合中的所有元素都必须实现 Comparable 接口。此外,所有此类元素必须相互可比较:e1.compareTo(e2) 不得为集合中的任何元素 e1 和 e2 抛出 ClassCastException。

    你有两个选择:

    【讨论】:

      【解决方案2】:

      错误告诉你哪里出了问题:

      ClassCastException: fr.univtln.arouani277.vertebre.animal.Chien 无法转换为 java.lang.Comparable

      你应该让你的类Chien 实现Comparable。这记录在TreeSet 的构造函数中(强调我的):

      构造一个包含指定集合中元素的新树集,根据其元素的自然顺序排序。 插入集合中的所有元素都必须实现 Comparable 接口。 此外,所有此类元素必须相互可比较:e1.compareTo(e2) 不得为集合中的任何元素 e1 和 e2 抛出 ClassCastException。

      这是意料之中的,因为 TreeSet 对其元素进行排序,因此它必须知道如何比较它们。

      由于你正在构建一个复杂的类层次结构,也许Comparable 接口应该由顶级类Vertebre 实现。这取决于您希望如何实际进行比较。

      【讨论】:

        猜你喜欢
        • 2010-12-19
        • 2010-11-30
        • 2015-09-24
        • 2016-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多