TreeSet的学习

TreeSet is another popular implementation of Set interface along with HashSet and LinkedHashSet. All these implementations of Set interface are required in different scenarios. If you don’t want any order of elements, then you can use HashSet. If you want insertion order of elements to be maintained, then use LinkedHashSet. If you want elements to be ordered according to some Comparator, then use TreeSet. The common thing of these three implementations is that they don’t allow duplicate elements.

理解:如果不需要set中的元素遵循某个规律的时候,你就可以用hashset集合,当你需要保持插入元素的顺序的时候,你就可以用LinkedHashSet集合.如果需要自己定义compator来给元素进行排序的时候,你就可以用TreeSet.这三个集合的共同点是它们都不允许有重复的元素.

In this article, I have tried to explain two examples of Java TreeSet. One example doesn’t use Comparator and another example uses Comparator to order the elements. You can go through some basic properties of TreeSet class here.

Java TreeSet Example With No Comparator :

You already know that if you don’t pass any comparator while creating a TreeSet, elements will be placed in their natural ascending order. In this example, we create a TreeSet of Integers without supplying any Comparator like this,

TreeSet<Integer> set = new TreeSet<Integer>();

Let’s add some integer elements to it.

set.add(23);     

set.add(11);   

set.add(41);     

set.add(7);

set.add(69);

set.add(18);

set.add(38);

Print these elements and observe the output.

System.out.println(set);      //Output : [7, 11, 18, 23, 38, 41, 69]

You can notice that elements are placed in the ascending order.

The whole code for this example is,

public class TreeSetExample
{
    public static void main(String[] args)
    {
        //Creating a TreeSet without supplying any Comparator

        TreeSet<Integer> set = new TreeSet<Integer>();

        //Adding elements to TreeSet

        set.add(23);      

        set.add(11);    

        set.add(41);      

        set.add(7);

        set.add(69);

        set.add(18);

        set.add(38);

        //printing elements of TreeSet

        System.out.println(set);      //Output : [7, 11, 18, 23, 38, 41, 69]
    }
}

理解:默认情况下,元素为Integer的时候,元素是递增顺序的

Java TreeSet Example With Comparator :

In this example, we create one TreeSet by supplying a customized Comparator. In this example, we will try to create a TreeSet of Student objects ordered in the descending order of the percentage of marks they have obtained. That means, student with highest marks will be placed at the top.

Let’s create ‘Student’ class with three fields – id, name andperc_Of_Marks_Obtained.

class Student
{
    int id;

    String name;

    int perc_Of_Marks_Obtained;

    public Student(int id, String name, int perc_Of_Marks_Obtained)
    {
        this.id = id;

        this.name = name;

        this.perc_Of_Marks_Obtained = perc_Of_Marks_Obtained;
    }

    @Override
    public String toString()
    {
        return id+" : "+name+" : "+perc_Of_Marks_Obtained;
    }
}

Let’s define our own Comparator class “MyComparator” which compares the marks of two students.

class MyComparator implements Comparator<Student>
{
    @Override
    public int compare(Student s1, Student s2)
    {
        if(s1.id == s2.id)
        {
            return 0;
        }
        else
        {
            return s2.perc_Of_Marks_Obtained - s1.perc_Of_Marks_Obtained;
        }
    }
}

Important Note : TreeSet doesn’t use hashCode() and equals() methods to compare it’s elements. It uses compare() (or compareTo()) method to determine the equality of two elements. Therefore, I have kept the code which compares two Student objects based on their id in compare method itself. This removes possible duplicate elements (elements having same id) from the TreeSet.

Create one TreeSet of ‘Student‘ objects with ‘MyComparator‘ as a Comparator.

//Instantiating MyComparator

MyComparator comparator = new MyComparator();

//Creating TreeSet with ‘MyComparator‘ as Comparator.

TreeSet<Student> set = new TreeSet<Student>(comparator);

Add some elements of type ‘Student‘ to this TreeSet.

set.add(new Student(121, "Santosh", 85));

set.add(new Student(231, "Cherry", 71));

set.add(new Student(417, "David", 82));

set.add(new Student(562, "Praveen", 91));

set.add(new Student(231, "Raj", 61));         //Duplicate element

set.add(new Student(458, "John", 76));

set.add(new Student(874, "Peter", 83));

set.add(new Student(231, "Hari", 52));       //Duplicate element

set.add(new Student(568, "Daniel", 89));

Iterate through the TreeSet.

//Iterating through TreeSet

Iterator<Student> it = set.iterator();

while (it.hasNext())
{
    System.out.println(it.next());
}

Output will be,

562 : Praveen : 91
568 : Daniel : 89
121 : Santosh : 85
874 : Peter : 83
417 : David : 82
458 : John : 76
231 : Cherry : 71

You can notice that student with highest percentage of marks is placed at the top and also duplicate elements are not allowed in the TreeSet.

时间: 2024-12-20 19:34:44

TreeSet的学习的相关文章

Java 集合系列17之 TreeSet详细介绍(源码解析)和使用示例

概要 这一章,我们对TreeSet进行学习.我们先对TreeSet有个整体认识,然后再学习它的源码,最后再通过实例来学会使用TreeSet.内容包括:第1部分 TreeSet介绍第2部分 TreeSet数据结构第3部分 TreeSet源码解析(基于JDK1.6.0_45)第4部分 TreeSet遍历方式第5部分 TreeSet示例 转载请注明出处:http://www.cnblogs.com/skywang12345/admin/EditPosts.aspx?postid=3311268 第1部

java集合(三)Set集合之TreeSet详解

这一章,我们对TreeSet进行学习.我们先对TreeSet有个整体认识,然后再学习它的源码,最后再通过实例来学会使用TreeSet.内容包括:第1部分 TreeSet介绍第2部分 TreeSet数据结构第3部分 TreeSet源码解析(基于JDK1.6.0_45)第4部分 TreeSet遍历方式第5部分 TreeSet示例 第1部分 TreeSet介绍 TreeSet简介 TreeSet 是一个有序的集合,它的作用是提供有序的Set集合.它继承于AbstractSet抽象类,实现了Naviga

java集合17--TreeSet源码走读

概要 这一章,我们对TreeSet进行学习. 我们先对TreeSet有个整体认识,然后再学习它的源码,最后再通过实例来学会使用TreeSet.内容包括: 第1部分 TreeSet介绍 第2部分 TreeSet数据结构 第3部分 TreeSet源码解析(基于JDK1.6.0_45) 第4部分 TreeSet遍历方式 第5部分 TreeSet示例 转载请注明出处:http://www.cnblogs.com/skywang12345/admin/EditPosts.aspx?postid=33112

java集合与包装类

一.集合概述 1 为什么需要使用集合? 引入案例:存储每天产生的新闻. 是要解决数组的局限性(定长),由于数组定长,可能会导致内存浪费或者内存不够. 需要一种技术:能够根据数据量而动态伸缩内存空间一种技术. 与数组不同,没有长度限制 与数组不同,集合提供更多方便操作的方法 与数组不同,集合可以装不同类型的对象 2 什么是集合? 集合也叫容器,是用来装其它类型的对象元素的数据结构,有点类似数组 jdk提供一套容器框架,用来操作多个或者一组元素的容器 没有长度(元素个数)限制 集合提供一套各 种各样

java学习第17天(TreeSet HashSet)

Set集合的特点(与ArrayList相比) 无序,唯一 主要学习它的两个子类 HashSet集合 A:底层数据结构是哈希表(是一个元素为链表的数组) B:哈希表底层依赖两个方法:hashCode()和equals() 执行顺序: 首先比较哈希值是否相同 相同:继续执行equals()方法 返回true:元素重复了,不添加 返回false:直接把元素添加到集合 不同:就直接把元素添加到集合 如果想要自定义对象进行HashSet遍历,那么我们需要重写equals算法和HashCode方法. Tre

【Java学习笔记】&lt;集合框架&gt;TreeSet,Comparable,Comparator

1 public class Person implements Comparable{ 2 private String name; 3 private int age; 4 5 public Person(){ 6 super(); 7 } 8 public Person(String name, int age) 9 { 10 super(); 11 this.name = name; 12 this.age = age; 13 } 14 15 16 @Override 17 public

JavaSE入门学习36:Java集合框架之Set接口及其实现类HashSet和TreeSet

一Set接口 Set接口可以与数学中的集合的概念相对应.Set接口是Collection接口的子接口,Set接口里多个对象之间没有明 显的顺序.具体详细方法请参考API文档(可见身边随时带上API文档有多重要),基本与Collection接口中定义的方法相 同.只是行为不同(Set不允许包含重复元素). Set集合不允许重复元素,是因为Set判断两个对象相同不是使用==运算符,而是根据equals()方法.即两个对象 用equals()方法比较返回true,Set就不能接受两个相等的对象. 我们

黑马程序员-学习日记(集合类之TreeSet)

为什么会用到集合类? 面向对象语言对事物的体现都是以对象的方式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式. 数组虽然也可以存储对象,但长度固定.集合长度可变.数组中可以存储基本数据类型,集合只能存储对象. 集合类自身的特点 只用于存储对象,长度可变,能够存储不同类型的对象. 容器分了很多种,因此Java工程师对其进行了划分.这个划分成的体系就被成为集合框架. import java.util.*; class mapDemo { public static

黑马程序员——java学习9(毕15-16总结)——TreeSet

1. 1 package learn; 2 /* 3 * |--TreeSet 4 * 可以对Set集合排序 5 * 底层数据结构是二叉树 6 * 保证数据唯一性的依据:compareTo方法return 0:原序return 1: 7 * 8 * TreeSet排序的第一种方式:让元素子集具备比较性.元素需要实现compareTo接口,覆盖compareTo方法 9 * 也称为元素的自然顺序,默认顺序 10 * 11 * TreeSet的第二种排序方式:当元素自身不具备比较性时,或者具备的比较