TreeSet(一)--排序
TreeSet(一)
一、TreeSet定义:
import java.util.TreeSet;
/** TreeSet集合的特点:排序和唯一
*
* 通过观察TreeSet的add()方法,我们知道最终要看TreeMap的put()方法。
*/
public class TreeTest1 {
public static void main(String[] args) {
// 创建集合对象
// 自然顺序进行排序
TreeSet<Integer> treeSet = new TreeSet<Integer>();
// 创建元素并添加
treeSet.add(8);
treeSet.add(4);
treeSet.add(5);
treeSet.add(6);
treeSet.add(6);
// 遍历
for(Integer i : treeSet){
System.out.print(i);
}
}
}
/*后台输出:4568 重复会被覆盖*/
(2)如果存入对象怎么排序,记住如果是对象一定要重写Comparator方法
People对象
public class People implements Comparable {
private String name;
private String sex;
private int age;
/*提供set和get方法,全参和无参构造方法*/
@Override
public int compareTo(Object o) {
People people = (People) o;
if (people.age > this.age) {
return 1;
}
if (this.age == people.age) {
return this.name.compareTo(people.name);
}
if ( people.age<this.age ) {
return -1;
}
return 0;
}
}
测试类
public class SortTest {
public static void main(String[] args) {
People people1 = new People("小a", "男", 18);
People people2 = new People("小a", "女", 16);
People people3 = new People("小c", "女", 18);
People people4 = new People("小b", "女", 22);
People people5 = new People("小d", "男", 19);
Set<People> treeSet = new TreeSet<People>();
treeSet.add(people1);
treeSet.add(people2);
treeSet.add(people3);
treeSet.add(people4);
treeSet.add(people5);
Iterator iterator = treeSet.iterator();
while (iterator.hasNext()) {
People people = (People) iterator.next();
System.out.println("姓名:" + people.getName() + "\t年龄:" + people.getAge());
}
}
}

public class Student {
private String name;
private int chinese;
private int math;
private int english;
/*提供set和get方法,同时提供无参数,有参数构造方法*/
//同时单独要加上getSum方法
public int getSum(){
return this.chinese + this.english + this.math;
}
}
测试类
import java.util.Iterator;
import java.util.TreeSet; public class TreeTest2 { public static void main(String[] args) { Student student1=new Student("小明", 80, 90, 70);
Student student2=new Student("小王", 60, 80, 90);
Student student3=new Student("小钱", 100, 100, 80);
Student student4=new Student("小徐", 20, 10, 90);
Student student5=new Student("小李", 80, 80, 80);
Student student6=new Student("小李", 70, 80, 90); TreeSet<Student> treeSet=new TreeSet(new MyComparable()); treeSet.add(student1);
treeSet.add(student2);
treeSet.add(student3);
treeSet.add(student4);
treeSet.add(student5);
treeSet.add(student6); Iterator<Student> iterator=treeSet.iterator(); while(iterator.hasNext()){ Student student=iterator.next(); System.out.println(student.toString());
}
}
}
MyComparable类
import java.util.Comparator;
public class MyComparable implements Comparator<Student>{
@Override
public int compare(Student s1, Student s2) {
// 总分从高到低(注意这里是s2减s1)
int num = s2.getSum() - s1.getSum();
if(num>0){
return 1;
}
if(num<0){
return -1;
}
if(num==0){
//这步非常关键,没有这个如果总成绩相同名字不同 ,那set集合就默认是相同元素,就会被覆盖掉
return s2.getName().compareTo(s1.getName());
}
return 0;
}
}

/**
* 是不是很奇怪为什么只有五条数据,而不是六条,那是因为有一条数据被覆盖了。
* 你的Comparator实现类,是先比较成绩,成绩相同,在比较名字,那如果总成绩
* 相同,姓名也相同,那不是默认是重复数据,TreeSet当然给你覆盖掉了。所以这
* 里有个小李被覆盖掉了。那如何写才规范,下面这样就不会出现覆盖。
*/
@Override
// 创建一个TreeSet集合
public int compare(Student s1, Student s2) {
// 总分从高到低(注意这里是s2减s1)
int num = s2.getSum() - s1.getSum();
// 总分相同的不一定语文相同
int num2 = num == 0 ? s1.getChinese() - s2.getChinese() : num;
// 总分相同的不一定数学相同
int num3 = num2 == 0 ? s1.getMath() - s2.getMath() : num2;
// 总分相同的不一定英语相同
int num4 = num3 == 0 ? s1.getEnglish() - s2.getEnglish() : num3;
// 姓名还不一定相同
int num5 = num4 == 0 ? s1.getName().compareTo(s2.getName()) : num4;
return num5;
}
import java.util.Iterator;
import java.util.TreeSet;
import java.util.Random;
/*
* 编写一个程序,获取10个1至20的随机数,要求随机数不能重复。
*
* 分析:
* A:创建随机数对象
* B:创建一个TreeSet集合
* C:判断集合的长度是不是小于10
* 是:就创建一个随机数添加
* 否:不搭理它
* D:遍历TreeSet集合
*/
public class HashSetDemo {
public static void main(String[] args) {
// 创建随机数对象
Random r = new Random();
// 创建一个Set集合
TreeSet<Integer> treeSet = new TreeSet<Integer>();
// 判断集合的长度是不是小于10
while (treeSet.size() < 10) {
int x = r.nextInt(20) + 1;
treeSet.add(x);
}
// 遍历Set集合
for (int x : treeSet) {
System.out.println(x);
}
}
}
TreeSet(一)--排序的更多相关文章
- Java TreeSet集合排序 && 定义一个类实现Comparator接口,覆盖compare方法 && 按照字符串长度排序
package TreeSetTest; import java.util.Iterator; import java.util.TreeSet; import javax.management.Ru ...
- TreeSet集合排序方式一:自然排序Comparable
TreeSet集合默认会进行排序.因此必须有排序,如果没有就会报类型转换异常. 自然排序 Person class->实现Comparable,实现compareTo()方法 package H ...
- Comparator与Comparable,自定义排序和类比较器,TreeSet对象排序
/** * 学生类 * @author Administrator * */ public class Student { private String sno ; private String sn ...
- TreeSet 比较器排序 自定义对象
package cn.itcast.day21.treeset2; import java.util.Comparator; import java.util.TreeSet; /* * TreeSe ...
- TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素?
TreeSet要求存放的对象所属的类必须实现Comparable接口,该接口提供了比较元素的compareTo()方法,当插入元素时会回调该方法比较元素的大小.TreeMap要求存放的键值对映射的键必 ...
- TreeMap和TreeSet在排序时如何比较元素,Collections工具类中的sort()方法如何比较元素
TreeSet和TreeMap排序时比较元素要求元素对象必须实现Comparable接口 Collections的sort方法比较元素有两种方法: 元素对象实现Comparable接口 实体类Dog ...
- java TreeSet的排序之定制排序
TreeSet的自然排序是根据元素的大小进行升序排序的,若想自己定制排序,比如降序排序,就可以使用Comparator接口了: 该接口包含int compare(Object o1,Object o2 ...
- java TreeSet的排序之自然排序
TreeSet会调用元素的compareTo(Object o)方法来比较元素之间的大小关系,然后将集合里的元素按升序排列.此时需要排序元素的类必须实现Compareble接口,并覆写其int com ...
- TreeSet集合排序方式二:定制排序Comparator
Comparator有两种实现方式: 1,匿名内部类 2,创建一个类用于实现Comparator,该类创建的对象就是比较器 Person类 public class Person implements ...
随机推荐
- 表达式求值--Java实现
/*将中缀表达式--转化为后缀表达式--属于栈的一种应用 *具体思路: *1.扫描字符串,遇到操作数字符直接不管,存到一个字符串里边 *2.操作符优先级比较--定义了方法 * 栈中优先级高:出栈存进字 ...
- C++虚函数(09)
一旦基类定义了虚函数,该基类的派生类中的同名函数也自动称为虚函数. 虚函数只能是类中的一个成员函数,但不能是静态成员,关键字virtual用于类中该函数的声明中. 关键字virtual指示C++编译器 ...
- #define is unsafe
#define is unsafe Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- ES6中数组的新方法
数组的扩展 1.1扩展运算符 1.1.1:... 扩展运算符(spread)是三个点(...).它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列. <body> < ...
- Android 开发笔记___SD卡文件操作
package com.example.alimjan.hello_world.Utils; import android.graphics.Bitmap; import android.graphi ...
- JDK8 指南(译)
翻译自 java8-tutorial 新特性 Default Methods for Interfaces(接口的默认方法) Java 8 使我们能够通过使用 default 关键字将非抽象方法实现添 ...
- 运放的PID电路
PID就是(比例(proportion).积分(integral).导数(derivative)),在工程实际中,应用最为广泛的调节器控制规律为比例.积分.微分控制,简称PID控制,又称PID调节. ...
- 使用springboot完成密码的加密解密
现今对于大多数公司来说,信息安全工作尤为重要,就像京东,阿里巴巴这样的大公司来说,信息安全是最为重要的一个话题,举个简单的例子: 就像这样的密码公开化,很容易造成一定的信息的泄露.所以今天我们要讲的就 ...
- JSP内容复习
JSP的3个编译指令,7个动作指令,9个内置对象 三个编译指令(通知servlet引擎的处理消息,只在JSP转换成Servlet时起作用) 1.编译指令 page page指令用户定义JSP页面中的全 ...
- node笔记-node的好基友monggoDB
mongoDB--非关系型数据库的佼佼者 mongodb是一个基于分布式文件存储的数据库,由c++语言编写. 特点:高性能.易部署.易使用. 下载地址:http://www.mongodb.org/d ...