第 6 章集合 案例 6-1 Collection 单列集合的操作 一 案例描述 1 考核知识点编号 :063006002~063006008 063006018 名称 :Collection 单列集合 Arrays 工具类 2 练习目标 掌握 Collection 单列集合方法的使用 3 需求分析 Collection 是所有单列集合的根接口, 在 Collection 中定义了单列集合 (List 和 Set) 通用的 一些方法 为了让初学者熟悉 Collection 接口中的常用方法, 本案例将演示 Collection 单列集合中 的方法对集合进行操作来学习方法的使用 4 设计思路 ( 实现原理 ) 1) 编写一个类 Example01 2) 在类中定义两个字符串 : String str1 = "BeiJing is a beautiful city"; String str2 = "tom is a cat"; 3) 要求使用集合的相关知识对这两个字符串进行操作, 获取两个字符串中字符的并集和交集, 并遍历输出 二 案例实现 import java.util.*; public class Example01 { public static void main(string[] args){ String str1 = "BeiJing is a beautiful city"; String str2 = "tom is a cat"; // 1 先对字符串进行分隔, 转换为字符数组 String[] strings1 = str1.split(" "); String[] strings2 = str2.split(" "); // 2 将字符串数组转换为 ArrayList 集合 List<String> list1 = Arrays.asList(strings1); List<String> list2 = Arrays.asList(strings2); // 3 将 ArrayList 集合转换为 HashSet 集合 ( 可以去重 ) HashSet<String> set1 = new HashSet<>(list1); HashSet<String> set2 = new HashSet<>(list2);
// 获取并集 // set1.addall(set2); // 获取交集 set1.retainall(set2); // 打印操作结果 set1.foreach(o -> System.out.println(o)); 运行结果如图 6-1 所示 图 6-1 运行结果 三 案例总结 1 Collection 是所有单列集合的父接口, 因此在 Collection 中定义了单列集合 (List 和 Set) 通用的一些方法, 这些方法可用于操作所有的单列集合 同时 Arrays 工具类中也提供了大量的静态方法来操作数组 如表 6-1 所示 表 6-1 案例中的方法方法声明功能描述 String[] split(string regex) String 字符串类的方法, 使用指定规则 regex 对字符串进行切割, 返回字符串数组 static <T> List<T> aslist(t... a) Arrays 工具类的静态方法, 用于将泛型数据源转换为 ArrayList 集合并返回该集合 public HashSet(Collection<? extends E> HashSet 的有参构造方法, 用于将指定 Collection 集合转换为 c) HashSet 集合 boolean addall(collection<? extends E> Collection 接口的方法, 用于将一个 Collection 集合中的所有元 c) 素都添加到另一个集合中 boolean retainall(collection<?> c) Collection 接口的方法, 用于对比两个集合的共有元素 default void foreach(consumer<? super Iterable 接口中 JDK 8 新增的默认方法, 接收函数式接口对元素 T> action) 进行遍历
案例 6-2 Map 双列集合的操作 一 案例描述 1 考核知识点编号 :063006011~ 063006016 名称 :Map 双列集合 2 练习目标 掌握 Map 集合的常用方法的使用 3 需求分析 Map 是所有双列集合的根接口, 在 Map 中定义了双列集合通用的一些方法 为了让初学者 熟悉 Map 接口中的常用方法, 本案例将演示 Map 接口中的方法对集合进行操作来学习方法的使 用 4 设计思路 ( 实现原理 ) 1) 编写一个类 Example02 2) 假设有有如下一些学生信息 : id name 5 tom 2 jack 6 lucy 4 bob 1 tom 3) 根据所学集合知识统计学生信息 (id 对应 name 映射 ), 并且能够避免重复录入, 同时按照 id 顺序排序 4) 录入成功后, 查找并移除 name 为 bob 的学生 5) 最后对剩余学生遍历输出 二 案例实现 import java.util.*; import java.util.map.entry; public class Example02 { public static void main(string[] args) { // 1 创建 TreeMap 集合, 并根据 key 顺序排序 Map<String, String> map = new TreeMap<>((Object obj1, Object obj2) -> { String s1 = (String) obj1; String s2 = (String) obj2; return s1.compareto(s2); ); map.put("5", "tom"); map.put("2", "jack"); map.put("6", "lucy");
map.put("4", "bob"); map.put("1", "tom"); // 2 查找并删除 name 为 bob 的学生信息 Set<Entry<String,String>> set = map.entryset(); Iterator<Entry<String, String>> it = set.iterator(); while (it.hasnext()){ Entry<String, String> next = it.next(); if(next.getvalue().equals("bob")){ it.remove(); // 3 遍历集合元素 map.foreach((k, v) -> System.out.println(k + ":" + v)); 运行结果如图 6-2 所示 图 6-2 运行结果 三 案例总结 1 Map 集合存入元素时, 键 key 不会重复, 使用 TreeMap 可以定制元素排序规则 2 在对 Map 元素进行删除操作时, 通常是根据 key 删除元素, 当根据 value 删除元素时, 可以像案例代码中使用 iterator 迭代器查找对应 value 元素, 然后使用迭代器删除 ; 或者是对 map 集合进行遍历, 查找对应的 value 元素, 然后使用 map 集合通过 key 对元素删除 案例 6-3 聚合操作的使用 一 案例描述 1 考核知识点编号 :063006019~ 063006022 名称 :JDK 8 聚合操作的使用 2 练习目标 掌握 JDK 8 聚合操作的使用方法 3 需求分析
聚合操作主要使用 Stream 接口将集合 数组的中的元素转换为 Stream 流的形式, 并结合 Lambda 表达式的优势来进一步简化集合 数组中元素的查找 过滤 转换等操作, 这是 JDK 8 新增功能 本案例将使用聚合操作对集合进行操作, 从而方便初学者学习相关使用方法 4 设计思路 ( 实现原理 ) 1) 编写一个类 Example03 2) 假设有有如下一个字符串 : String[] str = {"cab","b","ke","ke","abcde","ad","edae"; 3) 要求使用聚合操作的相关知识将字符串最终转换为 list 集合, 并遍历输出, 输出结果为 : abcd eda k 二 案例实现 import java.util.arrays; import java.util.stream.collectors; public class Test { public static void main(string[] args) { String[] str = {"cab","b","ke","ke","abcde","ad","edae"; Arrays.stream(str).filter(s -> s.endswith("e")).distinct().sorted((s1,s2) ->{ return s2.length()-s1.length(); ).map(s -> s.substring(0, s.length()-1)).collect(collectors.tolist()).foreach(o -> System.out.println(o)); 运行结果如图 6-3 所示 图 6-3 运行结果 三 案例总结 1 通过聚合操作可以将集合 数组的中的元素转换为 Stream 流的形式, 并结合 Lambda 表达式的优 势来进一步简化集合 数组中元素的查找 过滤 转换等操作 2 JDK 8 中的聚合操作提供了大量操作流元素的方法, 案例中使用到了部分方法 如表 6-2 所示
方法声明 static <T> Stream<T> stream(t[] array) Stream<T> filter(predicate<? super T> predicate) Stream<T> distinct() Stream<T> sorted(comparator<? super T> comparator) Stream<R> map(function<? super T,? extends R> mapper) R collect(collector<? super T, A, R> collector) default void foreach(consumer<? super T> action) 表 6-2 案例中的方法功能描述 Arrays 工具类的静态方法, 可以将数组转换为 Stream 流元素 Stream 接口方法, 用于对流元素进行过滤, 返回一个新的流元素对象 Stream 接口方法, 用于对流元素进行去重, 返回一个新的流元素对象 Stream 接口方法, 用于对流元素进行排序 ( 可定制排序规则 ), 返回一个新的流元素对象 Stream 接口方法, 用于对流元素进行规则映射, 返回一个新的流元素对象 Stream 接口方法, 用于对流元素进行收集转换, 返回一个新的流元素对象 Iterable 接口的默认方法, 用于对元素进行遍历