今日学习目标
- TreeSet集合(重点)
- 排序算法
- 查找算法
- 可变参数
- Map集合(重点)
- 集合嵌套
-
1 TreeSet集合
1.1 TreeSet特点:
元素唯一
- 无索引
-
1.2排序规则
自然排序
- 存储元素所在的类需要实现Comparable并且重写compareto方法,指定排序规则
比较器排序
自然排序:自定义类实现Comparable接口,重写compareTo方法,根据返回值进行排序.
- 比较器排序: 创建TreeSet对象的时候传递Comparator的实现类对象,重写compareto方法,根据返回值进行排序.
- 两种方式中,关于返回值的规则:
- 如果返回值为负数,表示当前存入的元素是较小值,存左边
- 如果返回值为0,表示当前存入的元素跟集合中元素重复了,不存
- 如果返回值为正数,表示当前存入的元素是较大值,存右边
-
2 Collections集合工具类
2.1 shuffle方法
格式: public static void shuffle(List<?> list) 对集合中的元素进行打乱顺序
格式1:public static
void sort (List list): 对集合中的元素自然排序 - 此方法只能对list集合进行排序
- 从方法中泛型分析可知,集合中元素类型必须是Comparable的子类型
- 格式2:public static
void sort (List list, Comparator<? super T> c) - 需要定义比较器Comparator
- 对元素的类型没有要求
- 只能对list集合排序
sort方法是一个重载的方法,可以实现自然排序及比较器排序。
3 可变参数
3.1可变参数的格式和注意事项
格式 : 修饰符 返回值类型 方法名(数据类型… 变量名) { }
- public void show(int … num) : 表达式该方法可以接收任意个整数值 , 原理 : 其实就是一个int类型的数组
- 可变参数传参是只能作为最后一个参数
- 可变参数本质上是数组,不能作为方法的重载使用
-
3.2可变参数的
调用可变参数方法,可以给出零到任意多个参数
-
3.3 addAll方法
格式:static
boolean addAll(Collection<? super T> c , T… num) : 添加任意多个数据到集合中 该方法就是一个含有可变参数的方法,使用时可以传入任意多个实参,实用方便!
Collection<? super T>, 当确定?的类型,就可以往集合里添加此类型和其子类型
4 排序,查找算法
4.1 冒泡排序
将一组数据按照从小到大的顺序进行排序(改变符号也可以大到小)
- 冒泡排序原理 : 相邻元素两两作比较 , 大的元素往后放
for (int j = 0; j < arr.length - 1; j++) {for (int i = 0; i < arr.length - 1 - j; i++) {if (arr[i] > arr[i + 1]) {int temp = arr[i];arr[i] = arr[i + 1];arr[i + 1] = temp;}}System.out.println("第" + (j + 1) + "轮排序:" + Arrays.toString(arr));}}}
4.2 选择排序
选择排序原理 :和遍历求数组最小值一样,用上循环嵌套可以将全部待排序的数据元素排完。
注意事项 :
- 如果有n个元素,那么就要比较n-1次
每一趟中都会选出一个最值元素,较前一趟少比较一次
public class SortDemo {public static void main(String[] args) {int[] arr = {4, 1, 5, 3, 2};for (int i = 0; i < arr.length - 1; i++) {int minIndex = i;int min = arr[i];for (int j = i; j < arr.length; j++) {if (arr[j] < min) {minIndex = j;min = arr[j];}}if (i != minIndex) {int temp = arr[i];arr[i] = arr[minIndex];arr[minIndex] = temp;}}System.out.println(Arrays.toString(arr));}}
4.3 二分查找
原理 : 每次去掉一般的查找范围
-
5 Map集合
5.1 Map集合,特点
map集合为双列集合
- 特点 :
- 键不能重复,值可以重复
- 键和值是 一 一 对应的,通过键可以找到对应的值
- (键 + 值) 一起是一个整体 我们称之为“键值对” 或者 “键值对对象”,在Java中叫做“Entry对象”
使用场景:
HashMap: 此前HashSet底层就是由HashMap完成的,HashSet保存的元素就是HashMap集合中保存的键,底层结构是哈希码表,具有唯一,无序的特点
- 注意 : HashMap集合要保证键唯一, 那么键所在的类必须重写hashCode和equals方法
- LinkedHashMap:底层结构是由链表和哈希表结构组成,元素唯一,有序
- TreeMap: 底层是红黑树,键去重
- 若自定义类没有自然排序功能,或自然排序功能不满足要求时。可以自定义比较器排序(Comparator)
- 可以自然排序(键所在的类要实现Comparable)
5.3 常用的方法
- public V put(K key, V value)
- 把指定的键和值添加到Map集合中
- public V remove(Object key)
- 把指定的键所对应的键值对再集合中删除,返回被删除的元素
- public V get(Object key)
- 根据指定的键,再Map集合中获取对应的值
- public Set
keySet() - 获取Map集合中所有的键,存储到Set集合中
public boolean containKey(Object key)
-
5.4 Map集合的遍历方式
第一种方式 : 键找值遍历 需要先获取Set集合存储键
// 获取健集合Set<String> set = hm.keySet();// 遍历健集合 , 通过键找值for (String key : set) {String value = hm.get(key);System.out.println(key + "---" + value);}}
第二种方式 : 获取键值对对象 , 在找到键和值 需要获取Entry对象
// 获取键值对对象集合Set<Map.Entry<String, String>> set = hm.entrySet();// 遍历键值对对象集合 , 获取每一个键值对对象for (Map.Entry<String, String> entry : set) {// 通过entry对象获取键String key = entry.getKey();// 通过entry对象获取值String value = entry.getValue();System.out.println(key + "--" + value);}}
6 集合嵌套(看懂代码)
6.1 List嵌套List
public static void main(String[] args) {List<String> 三年一班 = new ArrayList<>();三年一班.add("迪丽热巴");三年一班.add("古力娜扎");三年一班.add("马尔扎哈");三年一班.add("欧阳娜娜");List<String> 三年二班 = new ArrayList<>();三年二班.add("李小璐");三年二班.add("白百何");三年二班.add("马蓉");List<String> 三年三班 = new ArrayList<>();三年三班.add("林丹");三年三班.add("文章");三年三班.add("陈赫");List<List<String>> 年级 = new ArrayList<>();年级.add(三年一班);年级.add(三年二班);年级.add(三年三班);for (List<String> 班级 : 年级) {for (String name : 班级) {System.out.println(name);}System.out.println("-----------------");}}
6.2 List嵌套Map
```java public static void main(String[] args) { Map
三年一班 = new HashMap<>(); 三年一班.put(“it001”, “迪丽热巴”); 三年一班.put(“it002”, “古力娜扎”); 三年一班.put(“it003”, “马尔扎哈”); 三年一班.put(“it004”, “欧阳娜娜”);
-
Map<String, String> 三年二班 = new HashMap<>();三年二班.put("it001", "李小璐");三年二班.put("it002", "白百何");三年二班.put("it003", "马蓉");Map<String, String> 三年三班 = new HashMap<>();三年三班.put("it001", "林丹");三年三班.put("it002", "文章");三年三班.put("it003", "陈赫");List<Map<String, String>> 年级 = new ArrayList<>();年级.add(三年一班);年级.add(三年二班);年级.add(三年三班);for (Map<String, String> 班级 : 年级) {Set<String> studentId = 班级.keySet();for (String id : studentId) {String name = 班级.get(id);System.out.println(id + "---" + name);}System.out.println("=================");}}
<a name="LybrQ"></a>### 6.3 Map嵌套Map```javapublic static void main(String[] args) {Map<String, String> 三年一班 = new HashMap<>();三年一班.put("it001", "迪丽热巴");三年一班.put("it002", "古力娜扎");三年一班.put("it003", "马尔扎哈");三年一班.put("it004", "欧阳娜娜");Map<String, String> 三年二班 = new HashMap<>();三年二班.put("it001", "李小璐");三年二班.put("it002", "白百何");三年二班.put("it003", "马蓉");Map<String, String> 三年三班 = new HashMap<>();三年三班.put("it001", "林丹");三年三班.put("it002", "文章");三年三班.put("it003", "陈赫");Map<String, Map<String, String>> 年级 = new HashMap<>();年级.put("三年一班", 三年一班);年级.put("三年二班", 三年二班);年级.put("三年三班", 三年三班);Set<String> 班级名字集合 = 年级.keySet();for (String 班级名字 : 班级名字集合) {Map<String, String> 班级信息 = 年级.get(班级名字);Set<String> 学生学号 = 班级信息.keySet();for (String 学号 : 学生学号) {String 姓名 = 班级信息.get(学号);System.out.println("班级名字:" + 班级名字 + " ,学号:" + 学号 + " , 名字:" + 姓名);}System.out.println("============");}}
