32、TreeSet简介

使用TreeSet存储Integer对象

TreeSet的特点是可以对存放进去的元素进行排序。

package com.sutaoyu.list;

import java.util.TreeSet;

public class list_test_18 {
    public static void main(String[] args) {
        TreeSet<Integer> ts = new TreeSet<>();
        ts.add(3);
        ts.add(3);
        ts.add(3);
        ts.add(1);
        ts.add(1);
        ts.add(2);
        ts.add(4);
        ts.add(5);
        ts.add(7);
        ts.add(6);
        System.out.println(ts);
    }
}

使用TreeSet存储自定义类型对象

这里还是存储之前定义的Person对象,需要实现Comparable接口并且重写compareTo方法,先根据name的字典顺序排序,然后再根据年龄进行排序。

package com.sutaoyu.TreeSet;

import java.util.TreeSet;

public class TreeSet_test_1 {

    public static void main(String[] args) {
        TreeSet<Person> ts = new TreeSet<>();
        ts.add(new Person("tony",23));
        ts.add(new Person("paul",20));
        ts.add(new Person("andy",22));
        ts.add(new Person("james",24));
        ts.add(new Person("lucy",21));

        System.out.println(ts);

    }
}

测试类里面如果name写的是中文的话则不能进行汉语拼音排序,因为String类中重写的compareTo方法是根据char类型对应的ascii值进行排序的。

compareTo方法的返回值

TreeSet使用了二叉树的数据结构,负数放到左边,正数放到右边。

  • 当compareTo方法返回0的时候,系统会认为两者一致,所以不会向集合中添加元素
  • 当compareTo方法返回正数的时候,系统将元素存储到右边,所以集合存取顺序一致

  • 当compareTo方法返回负数的时候,系统将元素存储到左边,所以集合会倒序存储

Comparator比较器

可以向TreeSet的构造方法中传入一个定制的Comparator,如果传入了Comparator的子类对象, 那么TreeSet就会按照传入对象中定制的规则排序。例如将Person中name按照长度排序。

定制一个CompareByNameLength类实现Comparator接口并重写compare方法,在方法里面编写排序规则

package com.monkey1024.set;

import java.util.Comparator;

import com.monkey1024.bean.Person;

public class CompareByNameLength implements Comparator<Person> {

    @Override
    public int compare(Person p1, Person p2) {
        //根据name长度进行排序
        int num = p1.getName().length() - p2.getName().length();
        if(num == 0){
            num = p1.getName().compareTo(p2.getName());
            if(num == 0){
                num = p1.getAge() - p2.getAge();
            }
        }
        return num;
    }

}

测试类,向TreeSet的构造方法中传入CompareByNameLength对象

package com.monkey1024.set;

import java.util.TreeSet;

import com.monkey1024.bean.Person;

/**
 * TreeSet可以对元素进行排序
 * 使用TreeSet根据name长度进行排序
 *
 */
public class TreeSetTest03 {

    public static void main(String[] args) {
        TreeSet<Person> ts = new TreeSet<>(new CompareByNameLength());
        ts.add(new Person("tony", 23));
        ts.add(new Person("jordan", 20));
        ts.add(new Person("tim", 22));
        ts.add(new Person("james", 24));
        ts.add(new Person("an", 21));

        System.out.println(ts);
    }

}

练习:

1.将一个字符串中的字符按照字典顺序进行排序,要保留重复的字符。例如输入:java,打印aajv

答案:

1.向输入的字符串转换为字符数组,然后向TreeSet中添加字符

package com.monkey1024.set.exercise;

import java.util.Comparator;
import java.util.Scanner;
import java.util.TreeSet;

/**
 * 问题:将一个字符串中的字符按照字典顺序进行排序,要保留重复的字符。例如输入:java,打印aajv
 * 分析:向输入的字符串转换为字符数组,然后向TreeSet中添加字符
 */
public class Exercise03 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);            //创建键盘录入对象
        System.out.println("请输入一行字符串:");
        String line = sc.nextLine();                    //将键盘录入的字符串存储在line中
        char[] arr = line.toCharArray();                //将字符串转换成字符数组
        TreeSet<Character> ts = new TreeSet<>(new Comparator<Character>() {

            @Override
            public int compare(Character c1, Character c2) {
                int num = c1.compareTo(c2);
                //保存重复数据
                return num == 0 ? 1 : num;
            }
        });

        for(char c : arr) {
            ts.add(c);
        }

        for(Character ch : ts) {
            System.out.print(ch);
        }
    }

}

原文地址:https://www.cnblogs.com/zhuifeng-mayi/p/10136507.html

时间: 2024-11-02 17:08:44

32、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高级部分--集合(2)

一.集合类 Java中数组与集合的比较 1.数组也是容器,它是定长的,访问较快,但是数组不会自动扩充2.数组可以包含基本数据类型或引用类型的对象,而集合中只能包含引用类型的对象 Java中集合框架层次结构 Collection接口 1.一组称为元素的对象 2.一个Collection中可以放不同类型的数据1.是Set接口和List接口的父类2.是否有特定的顺序以及是否允许重复,取决于它的实现 3.Set - 无序的集合:不允许重复  如:HashSet4.List - 有序的集合:允许重复  如

java之容器(集合)

知识点: 容器的作用和概览 数组总结回顾 作用 是一种容器,可以在其中放置对象或基本类型数据.从而,实现使用数组管理一组对象. 优势 是一种简单的线性序列,可以快速的访问数组元素,效率高.如果从效率和类型检查的角度讲,数组是最好的. 劣势 不灵活:容量事先定义好,不能随着需求的变化而扩容. 比如:我们在一个用户管理系统中,要把今天注册的所有用户取出来,那么这个用户有多少个?我们在写程序时是无法确定的. 因此,数组远远不能满足我们的需求. 我们需要一种灵活的,容量可以随时扩充的容器来装载我们的对象

使用C++扩展Python的功能 转自:http://blog.csdn.net/magictong/article/details/8897568#comments

使用C++扩展Python的功能 环境 VS2005Python2.5.4 Windows7(32位) 简介 长话短说,这里说的扩展Python功能与直接用其它语言写一个动态链接库,然后让Python来调用有点不一样(虽然本质是一样的).而是指使用Python本身提供的API,使用C++来对Python进行功能性扩展,可以这样理解,使用更高效的语言实现一些算法计算等等需要更高执行效率的核心(或者需要与系统进行密切交互的)模块,然后让Python像调用内建标准库的方式来调用这些模块,听起来是不是很

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

date3(form表单,今天html结束)

参考: http://www.cnblogs.com/yuanchenqi/articles/6835654.html form表单是用来向后端服务器提交数据的,本次主要掌握的有input,select标签, form标签中必须要有的一个属性是name,是键的意思(向后端发送数据是以字典的形式发送的),value提供的方式有多种,不同的具体对待 form表单详细 表单标签: <form> 功能:表单用于向服务器传输数据,从而实现用户与Web服务器的交互 表单能够包含input系列标签,比如文本

Java基础(十一)

一.集合框架 1.集合框架定义 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个层次. 实现(类):是集合接口的具体实现.从本质上讲,它们是可重复使用的数据结构. 算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序.这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现. 除了集合,该框架也定义了几个Map接口和类.Map里存储的是

django 组合搜索

urls: urlpatterns = [ path('admin/', admin.site.urls), path('index/', views.index), re_path(r'^video-(?P<direction_id>(\d+))-(?P<classes_id>(\d+))-(?P<level_id>(\d+)).html$',views.video,name='video2'),#使用关键字正则表达式匹配] models: class Directi