0%

Java(24)Collections类和Map集合

Collections类

Comparable

1
2
3
4
5
Collections:
public static <T> boolean addAll(Collection<T> c, T... elements):往集合中添加一些元素。
public static void shuffle(List<?> list) 打乱顺序:打乱集合顺序。
public static <T> void sort(List<T> list):将集合中元素按照默认规则排序。
public static <T> void sort(List<T> list,Comparator<? super T> ):将集合中元素按照指定规则排序。

注意:

sort排序使用前提:

  • 被排序的集合里面存储的元素,必须实现Comparable,重写接口中的方法compareTo定义排序的规则

Comparable接口的排序规则:

  • (自己(this) - 参数)——升序

Person类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package com.tipdm.Demo02;

public class Person implements Comparable<Person>{
private String name;
private int age;

public String getName() {
return name;
}

@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public Person(String name, int age) {
this.name = name;
this.age = age;
}

public Person() {
}

// 重写排序的规则
@Override
public int compareTo(Person o) {
// return 0; // 认为元素都是相同的
// 自定义比较的规则,比较两个人的年龄(this, 参数Person)
return this.getAge() - o.getAge(); // 按照年龄升序排序
// return o.getAge() - this.getAge(); // 按照年龄降序排序
}
}

主类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package com.tipdm.Demo02;

import java.util.ArrayList;
import java.util.Collections;

/**
* Collections:
* public static <T> boolean addAll(Collection<T> c, T... elements):往集合中添加一些元素。
* public static void shuffle(List<?> list) 打乱顺序:打乱集合顺序。
* public static <T> void sort(List<T> list):将集合中元素按照默认规则排序。
* public static <T> void sort(List<T> list,Comparator<? super T> ):将集合中元素按照指定规则排序。
* 注意:
* sort排序使用前提
* 被排序的集合里面存储的元素,必须实现Comparable,重写接口中的方法compareTo定义排序的规则
* Comparable接口的排序规则:
* 自己(this) - 参数:升序
*/
public class demo1 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
// 往集合中添加多个元素
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
System.out.println(list); // [a, b, c, d, e]

// public static <T> boolean addAll(Collection<T> c, T... elements):往集合中添加一些元素。
Collections.addAll(list, "aa", "bb", "cc");
System.out.println(list); // [a, b, c, d, e, aa, bb, cc]
// public static void shuffle(List<?> list) 打乱顺序:打乱集合顺序。
Collections.shuffle(list);
System.out.println(list); // [d, aa, cc, a, e, b, bb, c]
// public static <T> void sort(List<T> list):将集合中元素按照默认规则排序。
Collections.sort(list);
System.out.println(list); // [a, aa, b, bb, c, cc, d, e]

// 对对象进行排序
ArrayList<Person> list02 = new ArrayList<>();
list02.add(new Person("张三", 15));
list02.add(new Person("李四", 20));
list02.add(new Person("王五", 26));
list02.add(new Person("赵六", 18));
System.out.println(list02); // [Person{name='张三', age=15},
// Person{name='李四', age=20},
// Person{name='王五', age=26},
// Person{name='赵六', age=18}]
System.out.println("=====================");
Collections.sort(list02); // 重写CompareTo方法才能进行排序
System.out.println(list02); // [Person{name='张三', age=15},
// Person{name='赵六', age=18},
// Person{name='李四', age=20},
// Person{name='王五', age=26}]

}
}
1
2
3
4
5
6
7
8
9
[a, b, c, d, e]
[a, b, c, d, e, aa, bb, cc]
[b, bb, aa, cc, e, c, d, a]
[a, aa, b, bb, c, cc, d, e]
[Person{name='张三', age=15}, Person{name='李四', age=20}, Person{name='王五', age=26}, Person{name='赵六', age=18}]
=====================
[Person{name='张三', age=15}, Person{name='赵六', age=18}, Person{name='李四', age=20}, Person{name='王五', age=26}]

进程已结束,退出代码0

Comparator

public static <T> void sort(List<T> list,Comparator<? super T> ):将集合中元素按照指定规则排序。

ComparatorComparable的区别:

  • Comparable:自己(this)和别人(参数)比较,自己需要实现Comparable接口,重写比较规则CompareTo方法

  • Comparator:相当于找一个第三方的裁判,比较两人

Comparator的排序规则:

  • o1 - o2 : 升序

  • o2 - o1 : 降序

Student类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package com.tipdm.Demo02;

public class Student {
private String name;
private int age;

@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}

public Student(String name, int age) {
this.name = name;
this.age = age;
}

public Student() {
}

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;
}
}

主类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package com.tipdm.Demo02;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

/**
* public static <T> void sort(List<T> list,Comparator<? super T> ):将集合中元素按照指定规则排序。
* Comparator和Comparable的区别:
* Comparable:自己(this)和别人(参数)比较,自己需要实现Comparable接口,重写比较规则CompareTo方法
* Comparator:相当于找一个第三方的裁判,比较两人
* Comparator的排序规则:
* o1 - o2 : 升序
* o2 - o1 : 降序
*/
public class demo2 {
public static void main(String[] args) {
ArrayList<Integer> list01 = new ArrayList<>();
list01.add(1);
list01.add(3);
list01.add(2);
System.out.println(list01);

Collections.sort(list01, new Comparator<Integer>() {
// 重写比较规则
@Override
public int compare(Integer o1, Integer o2) {
return o1 - o2; // 升序
// return o2 - o1; // 降序
}
});
System.out.println(list01);

ArrayList<Student> list02 = new ArrayList<>();
list02.add(new Student("迪丽热巴", 18));
list02.add(new Student("古力娜扎", 20));
list02.add(new Student("杨幂", 17));
list02.add(new Student("杨幂", 18));
System.out.println(list02);
// Collections.sort(list02, new Comparator<Student>() {
// @Override
// public int compare(Student o1, Student o2) {
// return o1.getAge() - o2.getAge(); // 年龄升序
// }
// });

// 扩展
Collections.sort(list02, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
int res = o1.getAge() - o2.getAge();
// 如果两个人年龄相同,再使用姓名的首字比较
if(res == 0){
res = o1.getName().charAt(0) - o2.getName().charAt(0);
}
return res;
}
});
System.out.println(list02);
}
}
1
2
3
4
5
6
[1, 3, 2]
[1, 2, 3]
[Student{name='迪丽热巴', age=18}, Student{name='古力娜扎', age=20}, Student{name='杨幂', age=17}, Student{name='杨幂', age=18}]
[Student{name='杨幂', age=17}, Student{name='杨幂', age=18}, Student{name='迪丽热巴', age=18}, Student{name='古力娜扎', age=20}]

进程已结束,退出代码0

Map集合

java.util.Map<K, V>集合

Map集合的特点:

  1. Map集合是一个双列集合,一个元素包含两个值 (一个key,一个value)

  2. Map集合中的元素,key和value的数据类型可以相同,也可以不同

  3. Map集合中的元素,key是不允许重复的,value是可以重复的。

  4. Map集合中的元素,key和value是一一对应

java.util.HashMap<k, v>集合 implements Map<k, v>接口

HashMap集合的特点:

  1. HashMap集合底层是哈希表:查询的速度特别快

​ JDK1.8之前:数组+单向列表

​ JDK1.8之后:数组+单向列表/红黑树(链表的长度超过8):提高查询速度

  1. hashMap集合是一个无序集合,存储元素和取出元素的顺序有可能不一致

Java.util.LinkedHashMap<k, v>集合 extends HashMap<k, v>集合

linkedHashMao的特点:

  1. LinkedHashMap集合底层是哈希表+链表(保证迭代的顺序)

  2. LinkedHashMap集合是一个有序的集合,存储元素和取出元素的顺序是一致的

public V put(K key, V value):把指定的键与指定的值添加到Map集合中。

public V remove(Object key):把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。

public V get(Object key):根据指定的键,在Map集合中获取对应的值。

boolean containsKey(Object key):判断集合中是否包含指定的键。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
package com.tipdm.Demo01;

import java.util.HashMap;
import java.util.Map;

public class demo1 {
public static void main(String[] args) {
show01();
System.out.println("=================");
show02();
System.out.println("=================");
show03();
System.out.println("=================");
show04();
}

/**
* boolean containsKey(Object key) 判断集合中是否包含指定的键。
* 包含,返回true
* 不包含,返回false
*/
private static void show04() {
// 创建Map集合对象,多态
Map<String, Integer> map = new HashMap<>();
map.put("赵丽颖", 168);
map.put("杨颖", 165);
map.put("林志玲", 178);

boolean b1 = map.containsKey("赵丽颖");
System.out.println(b1); // true

boolean b2 = map.containsKey("赵颖");
System.out.println(b2); // false
}

/**
* public V get(Object key): 根据指定的键,在Map集合中获取对应的值。
* 返回值:
* key存在,返回对应的value值
* key不存在,返回null
*/
private static void show03() {
// 创建Map集合对象,多态
Map<String, Integer> map = new HashMap<>();
map.put("赵丽颖", 168);
map.put("杨颖", 165);
map.put("林志玲", 178);

Integer v1 = map.get("杨颖");
System.out.println(v1); // 165

Integer v2 = map.get("迪丽热巴");
System.out.println(v2); // null
}

/**
* public V remove(Object key): 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。
* 返回值:V
* key存在,v返回被删除的值
* key不存在,v返回null
*/
private static void show02() {
// 创建Map集合对象,多态
Map<String, Integer> map = new HashMap<>();
map.put("赵丽颖", 168);
map.put("杨颖", 165);
map.put("林志玲", 178);
System.out.println(map); // {林志玲=178, 赵丽颖=168, 杨颖=165}

Integer v1 = map.remove("林志玲");
System.out.println(v1); // 178
System.out.println(map); // {赵丽颖=168, 杨颖=165}

Integer v2 = map.remove("林志颖");
System.out.println(v2); // null
}

/**
* public V put(K key, V value): 把指定的键与指定的值添加到Map集合中。
* 返回值: v
* 存储键值对的时候,key不重复,返回值V是null
* 存储键值对的时候,key重复,会使用新的value替换map中重复的value,返回被替换的value值
*/
private static void show01() {
// 创建Map集合对象,多态
Map<String, String> map = new HashMap<>();

String v1 = map.put("李晨", "范冰冰1");
System.out.println("v1:" + v1); // v1:null

String v2 = map.put("李晨", "范冰冰2");
System.out.println("v2:" + v2); // v2:范冰冰1

System.out.println(map); // {李晨=范冰冰2}

map.put("冷风", "龙小云");
map.put("杨过", "小龙女");
map.put("尹志平", "小龙女");
System.out.println(map); // {杨过=小龙女, 尹志平=小龙女, 李晨=范冰冰2, 冷风=龙小云}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
v1:null
v2:范冰冰1
{李晨=范冰冰2}
{杨过=小龙女, 尹志平=小龙女, 李晨=范冰冰2, 冷风=龙小云}
=================
{林志玲=178, 赵丽颖=168, 杨颖=165}
178
{赵丽颖=168, 杨颖=165}
null
=================
165
null
=================
true
false

进程已结束,退出代码0

遍历Map集合

public Set<K> keySet():获取Map集合中所有的键,存储到Set集合中。

37.1.1 Map集合的第一种遍历方式:通过键找值的方式

Map集合中的方法:

Set<K> keySet()返回此映射中包含的键的 Set 视图。

实现步骤:

  1. 使用Map集合中的方法keySet(),把Map集合所有的key取出来,存储到一个Set集合中

  2. 遍历set集合,获取Map集合中的每一个key

  3. 通过Map集合中的方法get(key),通过key找到value

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package com.tipdm.Demo01;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class demo2 {
public static void main(String[] args) {
// 创建Map集合对象,多态
Map<String, Integer> map = new HashMap<>();
map.put("赵丽颖", 168);
map.put("杨颖", 165);
map.put("林志玲", 178);

// 1. 使用Map集合中的方法keySet(),把Map集合所有的key取出来,存储到一个Set集合中
Set<String> set = map.keySet();

// 2. 遍历set集合,获取Map集合中的每一个key
// 使用迭代器遍历Set集合
Iterator<String> it = set.iterator();
while(it.hasNext()){
String key = it.next();
// 3. 通过key获取value
Integer value = map.get(key);
System.out.println(key + "=" + value);
}
System.out.println("===============================");
// 使用增强for遍历Set集合
for (String s : set) {
Integer value = map.get(s);
System.out.println(s+"="+value);
}
System.out.println("========================");
for (String s : map.keySet()) {
Integer value = map.get(s);
System.out.println(s+"="+value);
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
林志玲=178
赵丽颖=168
杨颖=165
===============================
林志玲=178
赵丽颖=168
杨颖=165
========================
林志玲=178
赵丽颖=168
杨颖=165

进程已结束,退出代码0

Map集合遍历的第二种方式:使用Entry对象遍历

Map集合遍历的第二种方式:使用Entry对象遍历

Map集合中的方法:

public Set<Map.Entry<K,V>> entrySet():获取到Map集合中所有的键值对对象的集合(Set集合)。

实现步骤:

  1. 使用Map集合中的方法entrySet,把Map集合中多个Entry对象取出来,存储到一个Set集合中

  2. 遍历Set集合,获取每一个Entry对象

  3. 使用Entry对象中的方法getKey()getValue()获取键与值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.tipdm.Demo01;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class demo3Entry {
public static void main(String[] args) {
// 创建Map集合对象,多态
Map<String, Integer> map = new HashMap<>();
map.put("赵丽颖", 168);
map.put("杨颖", 165);
map.put("林志玲", 178);

Set<Map.Entry<String, Integer>> set = map.entrySet();
for (Map.Entry<String, Integer> stringIntegerEntry : set) {
String key = stringIntegerEntry.getKey();
Integer value = stringIntegerEntry.getValue();
System.out.println(key + "=" + value);
}

}
}
1
2
3
4
5
林志玲=178
赵丽颖=168
杨颖=165

进程已结束,退出代码0

HashMap存储自定义类型键值

HashMap存储自定义类型键值

Map集合保证key是唯一的:

  • 作为key的元素,必须重写hashCode方法和equals方法,以保证key唯一

Person类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package com.tipdm.Demo01;

public class Person {
private String name;
private int age;

@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", 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 Person(String name, int age) {
this.name = name;
this.age = age;
}

public Person() {
}
}

Student类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package com.tipdm.Demo01;

import java.util.Objects;

public class Student {
private String name;
private int code;

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return code == student.code &&
Objects.equals(name, student.name);
}

@Override
public int hashCode() {
return Objects.hash(name, code);
}

@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", code=" + code +
'}';
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getCode() {
return code;
}

public void setCode(int code) {
this.code = code;
}

public Student(String name, int code) {
this.name = name;
this.code = code;
}

public Student() {
}
}

主类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package com.tipdm.Demo01;

import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
* HashMap存储自定义类型键值
* Map集合保证key是唯一的:
* 作为key的元素,必须重写hashCode方法和equals方法,以保证key唯一
*/
public class demo4 {
public static void main(String[] args) {
show01();
System.out.println("===================");
show02();
}

/**
* HashMap存储自定义类型键值
* key:Student:
* Student类必须重写hashCode方法和equals方法,以保证key唯一
* Person类型:
* value可以重复(同名同年龄的人视为同一个)
*/
private static void show02() {
// 创建HashMap对象
Map<Student, Person> map = new HashMap<>();
// 往map对象中添加元素
map.put(new Student("A同学", 1001), new Person("张三", 18));
map.put(new Student("B同学", 1002), new Person("李四", 19));
map.put(new Student("A同学", 1001), new Person("王五", 16));
map.put(new Student("D同学", 1004), new Person("赵六", 20));
map.put(new Student("E同学", 1005), new Person("钱七", 21));
for (Map.Entry<Student, Person> studentPersonEntry : map.entrySet()) {
System.out.println(studentPersonEntry);
}
}

/**
* HashMap存储自定义类型键值
* key:String类型:
* String类重写hashCode方法和equals方法,以保证key唯一
* Person类型:
* value可以重复(同名同年龄的人视为同一个)
*/
private static void show01() {
// 创建Hashmap集合
HashMap<String, Person> map = new HashMap<>();
// 往集合中添加元素
map.put("北京", new Person("张三", 18));
map.put("上海", new Person("李四", 19));
map.put("广州", new Person("王五", 18));
map.put("北京", new Person("赵六", 18));

Set<String> strings = map.keySet();
for (String string : strings) {
Person value = map.get(string);
System.out.println(string+"-->"+value); // 上海-->Person{name='李四', age=19}
// 广州-->Person{name='王五', age=18}
// 北京-->Person{name='赵六', age=18}


}
}
}
1
2
3
4
5
6
7
8
9
10
上海-->Person{name='李四', age=19}
广州-->Person{name='王五', age=18}
北京-->Person{name='赵六', age=18}
===================
Student{name='D同学', code=1004}=Person{name='赵六', age=20}
Student{name='E同学', code=1005}=Person{name='钱七', age=21}
Student{name='A同学', code=1001}=Person{name='王五', age=16}
Student{name='B同学', code=1002}=Person{name='李四', age=19}

进程已结束,退出代码0

LinkedHashMap类

java.util.LinkedHashMap<K,V> extends HashMap<>K, V>

Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序。

底层原理:

  • 哈希表+链表(记录元素的顺序)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package com.tipdm.Demo01;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Map;

/**
* java.util.LinkedHashMap<K,V> extends HashMap<>K, V>
* Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序。
* 底层原理:
* 哈希表+链表(记录元素的顺序)
*/
public class demo5LinkedHashMap {
public static void main(String[] args) {
HashMap<String, String> map = new HashMap<>();
map.put("a", "a");
map.put("d", "d");
map.put("c", "c");
map.put("b", "b");
map.put("b", "e");
System.out.println(map); // key不允许重复,无序{a=a, b=b, c=c, d=d}

LinkedHashMap<String, String> linkedMap = new LinkedHashMap<>();
linkedMap.put("a", "a");
linkedMap.put("d", "d");
linkedMap.put("c", "c");
linkedMap.put("b", "b");
linkedMap.put("b", "e");
System.out.println(linkedMap); // key不允许重复,有序 {a=a, d=d, c=c, b=b}
}
}
1
2
3
4
{a=a, b=e, c=c, d=d}
{a=a, d=d, c=c, b=e}

进程已结束,退出代码0

Hastable类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package com.tipdm.Demo01;

import java.util.HashMap;
import java.util.Hashtable;

/**
* java.util.Hashtable<K,V> implements Map<K,V>接口
*
* Hashtable:底层也是一个哈希表,是一个线程安全的集合,是单线程集合,速度慢
* HashMap:底层是一个哈希表,是一个线程不安全的集合,是多线程的集合,速度快
*
* HashMap集合(之前学的所有集合):可以存储null值, null键
* HashTable集合,不能存储null值,null键
*
* Hashtable和Vector集合一样,在jdk1.2版本之后被更先进的集合(HashMap, ArrayList)取代了
* Hashtable的子类Properties依然活跃在历史舞台
* Properties集合是一个唯一和IO流相结合的集合
*/
public class demo6HashTable {
public static void main(String[] args) {
HashMap<String, String> map = new HashMap<>();
map.put(null, "a");
map.put("b", null);
map.put(null, null);
System.out.println(map); // {null=null, b=null}

Hashtable<String, String> table = new Hashtable<>();
// table.put(null, "a"); // ullPointerException 空指针异常
// map.put("b", null); // ullPointerException 空指针异常
// map.put(null, null); // ullPointerException 空指针异常
}
}
1
2
3
{null=null, b=null}

进程已结束,退出代码0

练习:计算一个字符串中每个字符出现次数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package com.tipdm.Demo01;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;

/**
* **需求:**
*
* 计算一个字符串中每个字符出现次数。
*
* **分析:**
*
* 1. 获取一个字符串对象
* 2. 创建一个Map集合,键代表字符,值代表次数。
* 3. 遍历字符串得到每个字符。
* 4. 判断Map中是否有该键。
* 5. 如果没有,第一次出现,存储次数为1;如果有,则说明已经出现过,获取到对应的值进行++,再次存储。
* 6. 打印最终结果
*/
public class demo7Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.next();
HashMap<Character, Integer> map = new HashMap<>();
for (char c : str.toCharArray()) {
if (map.containsKey(c)){
Integer value = map.get(c);
map.put(c, value+1);
}else{
map.put(c, 1);
}
}
Set<Map.Entry<Character, Integer>> entries = map.entrySet();
for (Map.Entry<Character, Integer> entry : entries) {
System.out.println(entry);
}
}
}
1
2
3
4
5
6
7
8
9
 jscxhhn jnmdsmkflsdjfk
s=1
c=1
x=1
h=2
j=1
n=1

进程已结束,退出代码0
-------------本文结束感谢您的阅读-------------