Map
1. 概述
interface Map<K,V> K:键的类型;V:值的类型
2. 特点
- 键值对映射关系
- 一个键对应一个值
- 键不能重复,值可以重复
- 元素存取无序
3. 常用方法
- V put(K key,V value) 添加元素
- V remove(Object key) 根据键删除键值对元素
- void clear() 移除所有的键值对元素
- boolean containsKey(Object key) 判断集合是否包含指定的键
- boolean containsValue(Object value) 判断集合是否包含指定的值
- boolean isEmpty() 判断集合是否为空
- int size() 集合的长度,也就是集合中键值对的个数
- V get(Object key) 根据键获取值
- Set keySet() 获取所有键的集合
- Collection values() 获取所有值的集合
- Set<Map.Entry<K,V>> entrySet() 获取所有键值对对象的集合
4. 代码示例
- 创建map集合对象, 存储夫妻的姓名到集合中, 然后遍历集合, 得到每一对夫妻
public class Test {
public static void main(String[] args) {
// 创建map集合
Map<String, String> fqName = new HashMap<>();
// 向集合中添加元素
fqName.put("张无忌", "赵敏");
fqName.put("郭靖", "黄蓉");
fqName.put("杨过", "小龙女");
// 遍历集合(方式一)
// 1. 获取到key的集合
Set<String> keys = fqName.keySet();
// 2. 遍历keys
for (String key : keys) {
// 3. 通过key 获取 value
String value = fqName.get(key);
System.out.println(key + "<->" + value);
}
// 方式二
// 1. 获取到所有键值对对象的集合
Set<Map.Entry<String, String>> fqs = fqName.entrySet();
// 2. 遍历集合
for (Map.Entry<String, String> fq : fqs) {
// 3. 通过get方法获取键和值
String key = fq.getKey();
String value = fq.getValue();
System.out.println(key + "<->" + value);
}
}
}
运行结果:
5. 集合的嵌套案例
- 创建一个ArrayList集合,存储三个元素,每一个元素都是HashMap
- 每一个HashMap的键和值都是String,并遍历。
public class Test {
public static void main(String[] args) {
// 创建ArrayList 集合对象
ArrayList<Map<String, String>> maps = new ArrayList<>();
// 创建Map集合对象
Map<String, String> map1 = new HashMap<>();
// 向集合中添加元素
map1.put("孙策", "大乔");
map1.put("周瑜", "小乔");
// 把map集合添加到ArrayList集合中
maps.add(map1);
// 创建Map集合对象
Map<String, String> map2 = new HashMap<>();
// 向集合中添加元素
map1.put("郭靖", "黄蓉");
map1.put("杨过", "小龙女");
// 把map集合添加到ArrayList集合中
maps.add(map2);
// 遍历输出ArrayList集合中的元素
for (Map<String, String> map : maps) {
// 遍历map集合中的元素
Set<String> keys = map.keySet();
for (String key : keys) {
String value = map.get(key);
// 输出结果
System.out.println(key + "-" + value);
}
}
}
}
运行结果:
6. TreeMap集合练习
- 键盘录入一个字符串,要求统计字符串中每个字符串出现的次数。
- 举例:键盘录入“aababcabcdabcde” 在控制台输出:“a(5)b(4)c(3)d(2)e(1)”;
public class Test3 {
public static void main(String[] args) {
// 键盘录入字符串
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串");
String line = sc.next();
// 创建TreeMap集合
TreeMap<Character, Integer> tMap = new TreeMap<Character, Integer>();
// 遍历字符串
for (int i = 0; i < line.length(); i++) {
if (!tMap.containsKey(line.charAt(i))) {
tMap.put(line.charAt(i), 1);
} else {
Integer index = tMap.get(line.charAt(i));
tMap.put(line.charAt(i), ++index);
}
}
// 遍历集合对象
Set<Character> keys = tMap.keySet();
for (Character key : keys) {
Integer index = tMap.get(key);
System.out.print(key + "("+index+")");
}
}
}
运行结果:
Collections
1. 概述
- 是针对集合操作的工具类;
2. 常用方法
- public static void sort(List list) 将指定的列表按升序排序
- public static void reverse(List<?> list) 反转指定列表中元素的顺序
- public static void shuffle(List<?> list) 使用默认的随机源随机排列指定的列表
3. 案例
- ArrayList集合存储学生并排序
- 按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序
class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class CollectionsDemo02 {
public static void main(String[] args) {
//创建ArrayList集合对象
ArrayList<Student> array = new ArrayList<Student>();
//创建学生对象
Student s1 = new Student("linqingxia", 30);
Student s2 = new Student("zhangmanyu", 35);
Student s3 = new Student("wangzuxian", 33);
Student s4 = new Student("liuyan", 33);
//把学生添加到集合
array.add(s1);
array.add(s2);
array.add(s3);
array.add(s4);
//使用Collections对ArrayList集合排序
//sort(List<T> list, Comparator<? super T> c)
Collections.sort(array, new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
//按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序
int num = s1.getAge() - s2.getAge();
int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num;
return num2;
}
});
//遍历集合
for (Student s : array) {
System.out.println(s.getName() + "," + s.getAge());
}
}
}