`

理解TreeSet.add()方法

    博客分类:
  • java
阅读更多
Set存放不同元素,TreeSet存放不同元素,并且对元素进行排序。

Set<Object> set = new TreeSet<Object>();
set.add(new Integer(18));
set.add(new String("Bruce")); //Error

上面代码有错吗?


以上代码会抛出以下异常
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

当add()一个元素时,需要对元素进行排序,因此会强制转换类型进行比较。

结论:add()相同的类型

class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String toString() {
return this.name + " " + this.age;
}
}

Set<Object> set = new TreeSet<Object>();
set.add(new User("David", 25));
set.add(new User("Bruce", 26)); //Error

以上代码会抛出以下异常
Exception in thread "main" java.lang.ClassCastException: src.User cannot be cast to

java.lang.Comparable

结论:需要实现Comparable接口

JDK中实现了Comparable接口的类有:
BigDecimal、BigInteger、Byte、Double、Float、Integer、Long、Short
Character
String



class User implements Comparable {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String toString() {
return this.name + " " + this.age;
}
public int compareTo(Object o) {
User other = (User)o;
if (this.name.compareTo(other.name) > 0) return 1;
if (this.name.compareTo(other.name) < 0) return -1;
return 0;
}
}
public class Test {
    public static void main(String[] args){
    Set<Object> set = new TreeSet<Object>();
//创建5个不同对象
    set.add(new User("Phil", 25));
    set.add(new User("Admin", 25));
    set.add(new User("Bruce", 26));
    set.add(new User("Phil", 43));
    set.add(new User("Bruce", 37));
    for (Iterator it = set.iterator(); it.hasNext();) {
    System.out.println(it.next());
    }
    }
}
/**Output:
Admin 25
Bruce 26
Phil 25
*/
排序成功了,但是却少了2个对象。因为当compareTo()方法返回0时(即排序相等),TreeSet的add()方法会认为已经存在该对象,于是不加到集合当中。
分享到:
评论
1 楼 thekll 2013-09-22  
class User implements Comparable<User> {
private String name;
private int age;

public User(String name, int age) {
this.name = name;
this.age = age;
}

public String toString() {
return name + " " + age;
}

public int compareTo(User o) {
// User other = o;
// if (this.name.compareTo(other.name) > 0)
// return 1;
// if (this.name.compareTo(other.name) < 0)
// return -1;
// return 0;
return (name+age).compareToIgnoreCase(o.getName()+o.getAge());
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}



}

相关推荐

    数据结构(一些关于java的,不全,待补充)

    treeSet.add(3); treeSet.add(1); treeSet.add(2); // 自动排序 TreeMap, Integer&gt; treeMap = new TreeMap(); treeMap.put("A", 1); treeMap.put("B", 2); ``` 9. **优先队列(PriorityQueue)**:优先队列按...

    java中tree的实现

    尽管我们通常不直接使用`TreeNode`,但了解它的存在可以帮助我们理解`TreeMap`和`TreeSet`的工作原理。 除了基本的实现,Java中还有`java.awt.Tree`和`javax.swing.JTree`,这两个类主要用于图形用户界面(GUI)中...

    学生成绩排序(TreeSet方式实现)

    首先,我们需要理解`TreeSet`的工作原理。`TreeSet`内部基于红黑树(Red-Black Tree)数据结构,这是一种自平衡的二叉查找树,能够保证插入、删除和查找操作的时间复杂度为O(log n)。由于红黑树的特性,`TreeSet`...

    java 集合框架(TreeSet练习)

    总之,`TreeSet`是Java集合框架中一个强大且实用的工具,理解和熟练运用`TreeSet`不仅可以提高代码的可读性和维护性,还能在性能上带来显著提升。通过深入学习和实践,开发者可以更好地解决涉及排序和去重的问题。

    java基本集合类,java基本集合类

    treeSet.add("Element3"); treeSet.add("Element1"); ``` 在这个例子中,"Element1"会出现在"Element3"之前,因为它们按照自然顺序排序。 总结来说,选择哪种集合类取决于具体的需求,如是否需要保持元素顺序、是否...

    java集合使用实例

    此外,对于HashSet和TreeSet,它们都继承自Set接口,而HashMap和TreeMap则继承自Map接口,这意味着它们需要遵循接口定义的方法和行为。 在实际开发中,我们还需要考虑线程安全问题。如果多个线程同时访问这些集合,...

    Java TreeSet类的简单理解和使用

    Java TreeSet类的简单理解和使用 Java TreeSet类是Set接口的一个实现类,主要作用是用于对对象的排序以及确定存入对象的唯一性。TreeSet类可以自动地对存入的对象进行排序,并且保证存入的对象的唯一性。 在使用...

    java常见面试题java常见面试题

    对于`HashSet`和`TreeSet`而言,实现它们的关键在于理解它们背后的数据结构: - **HashSet**:为了保证元素的唯一性,`HashSet`使用哈希表作为底层数据结构。当一个对象被添加到`HashSet`时,会调用该对象的`...

    java集合排序方法总结共13页.pdf.zip

    理解各种排序算法的原理,如冒泡排序、插入排序、选择排序、归并排序、快速排序等,有助于在特定场景下选择最合适的排序方法。 13. 内存与空间复杂度 在考虑排序效率的同时,也要关注其内存占用,特别是在处理大...

    dataStructure:数据结构

    treeSet.add(3); treeSet.add(1); treeSet.add(2); int min = treeSet.first(); TreeMap, Integer&gt; treeMap = new TreeMap(); treeMap.put("Apple", 1); treeMap.put("Banana", 2); String keyWithMinValue = ...

    实验二、Java集合与XML实验.doc

    首先,我们深入理解Java集合框架中的Set接口及其具体实现。 1. **Set接口**:Set接口继承自Collection接口,它保证集合内的元素不重复,同时支持数学上的集合操作,例如交集、并集等。Set接口有两个重要的实现类:...

    Java 产生不重复随机数四种方法

    在Java编程中,生成不重复随机数是一项常见的需求,特别是在模拟抽奖、随机选取...ArrayList和LinkedList方法相对较慢,但易于理解和实现;TreeSet方法则可以生成有序的不重复随机数。根据具体应用场景选择合适的方法。

    第03章.java集合框架.ppt

    1. add 方法:将元素添加到集合中。 2. remove 方法:将元素从集合中移除。 3. contains 方法:检查元素是否存在于集合中。 4. iterator 方法:返回一个迭代器对象,用于遍历集合中的元素。 5. sort 方法:对集合中...

    day15_Collections、树形结构、Set.pdf

    本章主要介绍了Java中Collections类的常用方法,包括shuffle()、sort()等,以及Set集合的基本概念,特别是HashSet和TreeSet的区别。同时,讲解了如何对自定义类型进行排序,即实现Comparable接口或使用Comparator。...

    Java中的Set,List,Map的区别.pdf

    Java中的集合框架是编程中非常重要的部分,它提供了一种高效、灵活的方式来存储和操作对象。集合主要包括三种类型的接口:Set、List和Map。...理解它们的特性和使用场景,有助于在编程中选择合适的集合类型。

    JAVA-SE入门学习——第八讲集合

    使用toArray()方法将集合转换为数组,使用Arrays.asList()方法将数组转换为列表。 ```java public class CollectionArrayConversion { public static void main(String[] args) { String[] array = {"a", "b", "c...

    java 增加所需的元素

    除了以上提到的,Java还提供了许多其他数据结构,如`TreeSet`、`TreeMap`等,它们都有各自的添加元素的方法。在实际开发中,根据具体需求选择合适的数据结构进行元素的添加操作,可以有效提高代码的效率和可读性。 ...

    java开发常见问题1

    要增加日期,可以使用`Calendar`类的`add()`方法,如增加230天: ```java c1.add(Calendar.DAY_OF_YEAR, 230); ``` 日期格式的转换通常通过`SimpleDateFormat`类来完成。例如,将日期从一种格式转换为另一种: ``...

    java List 排序 Collections.sort

    在Java编程中,`List`接口是集合框架的重要组成部分,提供了有序的元素存储。...通过阅读和理解`Collections.sort()`的源码,开发者可以进一步提升自己的技能,同时也能更好地理解和运用其他Java集合框架的方法。

Global site tag (gtag.js) - Google Analytics