Java TreeSet用法详解

举报
zhushy 发表于 2021/11/18 15:14:13 2021/11/18
【摘要】 什么是TreeSetTreeSet是实现Set接口的实现类。所以它存储的值是唯一的,同时也可以对存储的值进行排序,排序用的是二叉树原理。TreeSet 是一个有序的集合,它的作用是提供有序的Set集合。TreeSet中的元素支持2种排序方式:自然排序 或者 根据创建TreeSet 时提供的 Comparator 进行排序。这取决于使用的构造方法。 TreeSet的基本使用自然排序的例子,i...

什么是TreeSet

TreeSet是实现Set接口的实现类。所以它存储的值是唯一的,同时也可以对存储的值进行排序,排序用的是二叉树原理。
TreeSet 是一个有序的集合,它的作用是提供有序的Set集合。TreeSet中的元素支持2种排序方式:自然排序 或者 根据创建TreeSet 时提供的 Comparator 进行排序。这取决于使用的构造方法。

TreeSet的基本使用

自然排序的例子,

import java.util.TreeSet;

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

输出为[1,2,3],结果不重复,并且结果是排序的。

自定义比较器的例子:

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

public class TreeSetDemo {
    public static void main(String[] args) {
        // TreeSet 按字符串长度排序,长度相等则按字符串字典序排序
        TreeSet<String> ts = new TreeSet<>(new Comparator<String>() {
         // compare方法的o1,o2。o1代表调用的对象,o2代表集合中的对象。
            @Override
            public int compare(String o1, String o2) {
                int num = o1.length() - o2.length();
                return num == 0 ? o1.compareTo(o2) : num;
            }

        });
        ts.add("c");
        ts.add("cc");
        ts.add("cc");
        ts.add("a");
        ts.add("aa");
        ts.add("bbbb");
        ts.add("ddddd");
        ts.add("zhushy");
        ts.add("zhushangyuan");
        System.out.println(ts);
    }
}

输出结果为:[a, c, aa, cc, bbbb, ddddd, zhushy, zhushangyuan]

TreeSet的遍历

TreeSet不支持快速随机遍历,只能通过迭代器进行遍历!

// 假设set是TreeSet对象
for(Iterator iter = set.iterator(); iter.hasNext(); ) { 
    iter.next();
}
for(Iterator iter = set.descendingIterator(); iter.hasNext(); ) { 
    iter.next();
}
// for-each遍历HashSet
// 假设set是TreeSet对象,并且set中元素是String类型
// 转换为数组
String[] arr = (String[])set.toArray(new String[0]);
for (String str:arr)
    System.out.printf("for each : %s\n", str);

完整的代码:

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

public class TreeSetDemo {
    public static void main(String[] args) {
        // TreeSet 按字符串长度排序,长度相等则按字符串字典序排序
        TreeSet<String> ts = new TreeSet<>(new Comparator<String>() {
            // compare方法的o1,o2。o1代表调用的对象,o2代表集合中的对象。
            @Override
            public int compare(String o1, String o2) {
                int num = o1.length() - o2.length();
                return num == 0 ? o1.compareTo(o2) : num;
            }

        });
        ts.add("c");
        ts.add("cc");
        ts.add("cc");
        ts.add("a");
        ts.add("aa");
        ts.add("bbbb");
        ts.add("ddddd");
        ts.add("zhushy");
        ts.add("zhushangyuan");
        // for-each遍历HashSet

        // 假设set是TreeSet对象,并且set中元素是String类型
        String[] arr = (String[]) ts.toArray(new String[0]);
        for (String str : arr)
            System.out.printf("for each : %s\n", str);
    }
}

参考资料

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。