Java基础知识强化之集合框架笔记47:Set集合之TreeSet保证元素唯一性和比较器排序的原理及代码实现(比较器排序)

1. TreeSet保证元素唯一性和比较器排序的原理及代码实现(比较器排序)

(1)Student.java:

 1 package cn.itcast_07;
 2
 3 public class Student {
 4     private String name;
 5     private int age;
 6
 7     public Student() {
 8         super();
 9     }
10
11     public Student(String name, int age) {
12         super();
13         this.name = name;
14         this.age = age;
15     }
16
17     public String getName() {
18         return name;
19     }
20
21     public void setName(String name) {
22         this.name = name;
23     }
24
25     public int getAge() {
26         return age;
27     }
28
29     public void setAge(int age) {
30         this.age = age;
31     }
32 }

(2)TreeSetDemo.java:

 1 package cn.itcast_07;
 2
 3 import java.util.Comparator;
 4 import java.util.TreeSet;
 5
 6 /*
 7  * 需求:请按照姓名的长度排序
 8  *
 9  * TreeSet集合保证元素排序和唯一性的原理
10  * 唯一性:是根据比较的返回是否是0来决定。
11  * 排序:
12  *         A:自然排序(元素具备比较性)
13  *             让元素所属的类实现自然排序接口 Comparable
14  *         B:比较器排序(集合具备比较性)
15  *             让集合的构造方法接收一个比较器接口的子类对象 Comparator
16  */
17 public class TreeSetDemo {
18     public static void main(String[] args) {
19         // 创建集合对象
20         // TreeSet<Student> ts = new TreeSet<Student>(); //自然排序
21         // public TreeSet(Comparator comparator) //比较器排序
22         // TreeSet<Student> ts = new TreeSet<Student>(new MyComparator());
23
24         // 如果一个方法的参数是接口,那么真正要的是接口的实现类的对象
25         // 而匿名内部类就可以实现这个东西
26         TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {
27             @Override
28             public int compare(Student s1, Student s2) {
29                 // 姓名长度
30                 int num = s1.getName().length() - s2.getName().length();
31                 // 姓名内容
32                 int num2 = num == 0 ? s1.getName().compareTo(s2.getName())
33                         : num;
34                 // 年龄
35                 int num3 = num2 == 0 ? s1.getAge() - s2.getAge() : num2;
36                 return num3;
37             }
38         });
39
40         // 创建元素
41         Student s1 = new Student("linqingxia", 27);
42         Student s2 = new Student("zhangguorong", 29);
43         Student s3 = new Student("wanglihong", 23);
44         Student s4 = new Student("linqingxia", 27);
45         Student s5 = new Student("liushishi", 22);
46         Student s6 = new Student("wuqilong", 40);
47         Student s7 = new Student("fengqingy", 22);
48         Student s8 = new Student("linqingxia", 29);
49
50         // 添加元素
51         ts.add(s1);
52         ts.add(s2);
53         ts.add(s3);
54         ts.add(s4);
55         ts.add(s5);
56         ts.add(s6);
57         ts.add(s7);
58         ts.add(s8);
59
60         // 遍历
61         for (Student s : ts) {
62             System.out.println(s.getName() + "---" + s.getAge());
63         }
64     }
65 }

运行结果如下:

时间: 2024-10-10 06:21:30

Java基础知识强化之集合框架笔记47:Set集合之TreeSet保证元素唯一性和比较器排序的原理及代码实现(比较器排序)的相关文章

Java基础知识强化之IO流笔记47:IO流练习之 随机获取文本文件中的姓名案例

1.  随机获取文本文件中的姓名案例     需求:我有一个文本文件中存储了几个名称,请大家写一个程序实现随机获取一个人的名字.     分析:           A:  把文本文件中的数据存储到集合中           B:  随机产生一个索引           C:  根据该索引获取一个值 2. 代码实现: 1 package cn.itcast_02; 2 3 import java.io.BufferedReader; 4 import java.io.FileReader; 5

Java基础知识强化之IO流笔记45:IO流练习之 把文本文件中数据存储到集合中的案例

1.  把文本文件中数据存储到集合中      需求:从文本文件中读取数据(每一行为一个字符串数据)到集合中,并遍历集合. 分析:      通过题目的意思我们可以知道如下的一些内容,      数据源是一个文本文件.      目的地是一个集合.      而且元素是字符串.      数据源:   b.txt -- FileReader -- BufferedReader  目的地:  ArrayList<String> 2. 代码示例: 1 package cn.itcast_02; 2

Java基础知识强化之IO流笔记69:Properties练习之 判断文件中是否有指定的键,如果有就修改值的案例

1. 我有一个文本文件(user.txt),我知道数据是键值对形式的,但是不知道内容是什么. 请写一个程序判断是否有"lisi"这样的键存在,如果有就改变其值为"100"  分析:  A:把文件中的数据加载到集合中  B:遍历集合,获取得到每一个键  C:判断键是否有为"lisi"的,如果有就修改其值为"100"  D:把集合中的数据重新存储到文件中 2. 代码实现: 1 package cn.itcast_08; 2 3 i

Java基础知识强化之IO流笔记66:Properties的概述 和 使用(作为Map集合使用)

1. Properties的概述  Properties:属性集合类.是一个可以和IO流相结合使用的集合类.Properties 可保存在流中或从流中加载.属性列表中每个键及其对应值都是一个字符串. Properties是Hashtable的子类,说明是一个Map集合. 2. Properties作为Map集合使用 1 package cn.itcast_08; 2 3 import java.util.Properties; 4 import java.util.Set; 5 6 /* 7 *

Java基础知识强化之IO流笔记45:IO流练习之 把集合中的数据存储到文本文件案例

1. 把集合中的数据存储到文本文件案例:    需求:把ArrayList集合中的字符串数据存储到文本文件 ? (1)分析:通过题目的意思我们可以知道如下的一些内容,ArrayList集合里存储的是字符串.遍历ArrayList集合,把数据获取到.然后存储到文本文件中.文本文件说明使用字符流. (2) 数据源: ArrayList<String> -- 遍历得到每一个字符串数据 目的地: a.txt -- FileWriter -- BufferedWriter 2. 代码示例: 1 pack

Java基础知识强化之IO流笔记68:Properties和IO流集合使用

1. Properties和IO流集合使用 这里的集合必须是Properties集合:  public void load(Reader reader):把文件中的数据读取到集合中  public void store(Writer writer,String comments):把集合中的数据存储到文件 2. 代码实现: 1 package cn.itcast_08; 2 3 import java.io.FileReader; 4 import java.io.FileWriter; 5 i

Java基础知识强化之IO流笔记07:自定义的异常概述和自定义异常实现

1. 开发的时候往往会出现很多问题(java内部系统框架中没有提供这些异常) 比如说:考试成绩必须在0~100之间. 很明显java没有对应的异常,需要我们自己来做一个异常. (1)继承自Exception(编译期) (2)继承自RuntimeException(运行期) 2. 自定义异常的案例: (1)自定义异常MyException继承自Exception,那么MyException属于编译期异常,如下: 1 package com.himi.myexception; 2 3 /** 4 *

Java基础知识强化之IO流笔记17:FileOutputStream构造方法使用

1. 可以参照之前写的笔记:   Android(java)学习笔记167:Java中操作文件的类介绍(File + IO流) 2. FileOutputStream(常用的)构造方法: FileOutputStream(File file)           Constructs a new FileOutputStream on the File file. FileOutputStream(String filename)           Constructs a new FileO

Java基础知识强化之网络编程笔记18:Android网络通信之 使用HttpClient的Post / Get 方式读取网络数据(基于HTTP通信技术)

使用HttpClient进行Get方式通信,通过HttpClient建立网络链接,使用HttpGet方法读取数据,并且通过Response获取Entity返回值. 使用HttpClient进行Post方式通信,通过HttpClient建立网络链接,使用HttpPost方法传出数据与读取数据,传出和传入的数据都是Entity的子类. 详见:Android(java)学习笔记211:采用httpclient提交数据(qq登录案例)

Java基础知识强化之网络编程笔记16:Android网络通信之 使用Http的Get方式读取网络数据(基于HTTP通信技术)

使用Http的Get方式读取网络数据,使用Get方式与网络通信是最常见的Http通信,建立链接之后就可以通过输入流读取网络数据. 详见:Android(java)学习笔记209:采用get请求提交数据到服务器(qq登录案例)