Map
键值对(key,value)
new不是new map对象,是new实现类的对象
Map<String,String> map = new HashMap<String,String>();
put会覆盖 以最新的为主
m.put("a","b");
String value=m.put("a","c");
System.out.println(value); //如果键已经存在,则返回的是原有值b
System.out.println(m); //而集合里显示最新的c
遍历方式(3种)
一、键找值
//1.把所有的键放到一个单列集合中
Set<String> keys=map.keySet();
//2.遍历单列集合,得到每一个键
for(String key:keys){
System.out.println(key);
//3.利用map集合中的键获取对应的值
String value =map.get(key);
System.out.println(key+" "+value);
}
二、键值对
获取键值对对象,分别用getKey()和getValue()获取键、值
Map<String,String> map = new HashMap<String,String>();
Set<Map.Entry<String, String>> entries = map.entrySet();//map.entrySet()再自动补全即可
//遍历entries集合,用get方法获取键值(entries调用for循环)
for (Map.Entry<String, String> entry : entries) {
String key =entry.getKey();
String value=entry.getValue();
System.out.println(key+" "+value);
}
三、Lambda表达式
HashMap
package Oct18;
import java.util.Objects;
public class Student {
private String name;
private int age;
//右键,ptg to javabean
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取
* @return age
*/
public int getAge() {
return age;
}
/**
* 设置
* @param age
*/
public void setAge(int age) {
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age && Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
public String toString() {
return "Student{name = " + name + ", age = " + age + "}";
}
}
法一:
package Oct18;
import java.util.Set;
import java.util.Map;
import java.util.HashMap;
public class One {
public static void main(String[] args) {
//由于学生放在键上,所以要重写hashCode和equals方法
//创建hashmap对象
HashMap<Student,String> hm = new HashMap<>();
//创建三个学生对象
//ctrl+d向下复制一行
Student s1 = new Student ("625",21);
Student s2 = new Student ("cy",20);
Student s3 = new Student ("小小鸠",3);
//添加元素
hm.put(s1,"辽宁");
hm.put(s2,"湖南");
hm.put(s3,"江苏");
//遍历集合
Set<Student> keys = hm.keySet();
for (Student key : keys) {
String value = hm.get(key);
System.out.println(key+"="+value);
}
}
}
法二:
Set<Map.Entry<Student, String>> entries = hm.entrySet();
for (Map.Entry<Student, String> entry : entries) {
Student key = entry.getKey();
String value = entry.getValue();
System.out.println(key+"="+value);
}
法三:
结果:
package Oct18;
import java.util.*;
public class Two {
public static void main(String[] args) {
//1.定义四个数组存储四个景点
String[] arr={"A","B","C","D"};
//利用随机数模拟80个同学的投票
ArrayList<String> list=new ArrayList<>();
Random r=new Random();
for (int i = 0; i < 80; i++) {
//在arr的长度内随机生成索引,然后再通过索引找到对应元素
int index = r.nextInt(arr.length);//随机索引
System.out.println(arr[index]);//打印同学的投票
list.add(arr[index]);
}
//80个同学投完票了,开始统计
//string代表景点名称 integer代表景点出现次数
HashMap<String,Integer> hm =new HashMap<>();
//hm是hashmap对象;name是临时变量代表景点名;
for (String name : list) {
//判断当前景点在map里面是否存在
if(hm.containsKey(name)){
//景点已存在,次数+1
//先获取当前景次数
int count = hm.get(name);
count++;
//更新次数
hm.put(name,count);
}
else{
//景点不存在,创建景点,次数为一
hm.put(name,1);
}
}
System.out.println(hm);
//求哪个景点人最多(那个map里谁的值最大)
int max =0;
Set<Map.Entry<String, Integer>> entries = hm.entrySet();
//这句话Set<>代表集合;每个Map.Entry<>代表一个键值对;<>为泛型。
//这句话用来获取HashMap hm 中所有键值对的集合,然后后续的代码通过遍历entries集合来处理键值对
//hm是hashmap对象,hm.entrySet()返回一个包含HashMap中所有键值对(即键和对应的值)的集合
//entry是一个键值对(Map.Entry),entries是包含所有键值对的集合(Set类型)
for (Map.Entry<String, Integer> entry : entries) {
int count = entry.getValue();
if(count>max){
max=count;
}
}
System.out.println("最大值是:"+max);
//哪些景点都是最大值,都得打印
for (Map.Entry<String, Integer> entry : entries) {
int count = entry.getValue();
if(count==max){
System.out.println("投票最多的是:"+entry.getKey());
}
}
}
}
LinkHashMap
package Oct18;
import java.util.LinkedHashMap;
public class LinkHashMap {
public static void main(String[] args) {
//1.创建集合
LinkedHashMap<String,Integer> lhm = new LinkedHashMap<>();
//2.添加元素
lhm.put("a",123);
lhm.put("a",123);
lhm.put("b",456);
lhm.put("c",789);
}
}
TreeMap
代码书写两种排序规则如果都写了,则以第二种(Comparator)为准。
默认升序排列
package Oct18;
import java.util.Comparator;
import java.util.TreeMap;
public class TreeMap1 {
public static void main(String[] args) {
//改变排序方式:在小括号里,new Comparator(若什么都不写则默认升序)
TreeMap<Integer,String> tm = new TreeMap<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
//o1:当前要添加的元素
// o2:已经在红黑树中存在的元素
return o1-o2;//升序
//return o2-o1; 降序
return 0;
}
});
tm.put(1,"cy");
tm.put(2,"625");
tm.put(3,"小小鸠1");
tm.put(4,"小小鸠2");
tm.put(5,"小小鸠3");
System.out.println(tm);
}
}
TreeMap
package Oct18;
import java.util.TreeMap;
public class TreeMap2 {
public static void main(String[] args) {
TreeMap<Student2,String> tm =new TreeMap<>();
Student2 s1 =new Student2("625",21);
Student2 s2 =new Student2("cy",20);
Student2 s3 =new Student2("小小鸠",3);
tm.put(s1,"辽宁");
tm.put(s2,"湖南");
tm.put(s3,"江苏");
//要利用Comparable指定打印顺序(姓名年龄一样的为同一个人;升序排列)
System.out.println(tm);
}
}
Student
package Oct18;
public class Student2 implements Comparable<Student2>{
private String name;
private int age;
public Student2() {
}
public Student2(String name, int age) {
this.name = name;
this.age = age;
}
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取
* @return age
*/
public int getAge() {
return age;
}
/**
* 设置
* @param age
*/
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "Student2{name = " + name + ", age = " + age + "}";
}
@Override
public int compareTo(Student2 o) {
//指定比较规则:姓名年龄一样的为同一个人;升序排列
//this:当前要添加的
//o:在红黑树中已存在的元素
int i=this.getAge()-o.getAge();
//返回值:
//正数:当前大,存右边
//负数:当前小,存右边
//0:当前已存在,舍弃
//已存在则按名字排序(i==0),否则返回i本身(i!=0)
i=(i==0?this.getName().compareTo(o.getName()):i);
return i;
}
}
注意这段方法重写:
结果排序用TreeMap,不要求排序用HashMap
package Oct18;
import java.util.StringJoiner;
import java.util.TreeMap;
import java.util.function.BiConsumer;
public class TreeMap3 {
public static void main(String[] args) {
String s="ashdajdknqjbasababab";
TreeMap<Character,Integer> tm=new TreeMap<>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
//在循环内,通过 s.charAt(i) 获取字符串's'中索引为i的字符,并将它赋给变量c
if(tm.containsKey(c)){
//把原次数拿出来
int count =tm.get(c);
//加一
count++;
//添加结果
tm.put(c,count);
}else{
tm.put(c,1);
}
}
System.out.println("------------默认排序-----------");
System.out.println(tm);
System.out.println("------------StringBulider自定义排序------------");
//遍历集合,按照指定样式拼接
StringBuilder sb =new StringBuilder();
/*tm.forEach(new BiConsumer<Character, Integer>() {
@Override
public void accept(Character key, Integer value) {
sb.append(key).append("(").append(value).append(")");
}
});*/
//简略为Lamda表达式
tm.forEach((key, value)-> sb.append(key).append("(").append(value).append(")"));
System.out.println(sb);
System.out.println("------------StringJoiner自定义排序-------------");
//要指定开始结束和间隔符号
StringJoiner sj =new StringJoiner("","","");
//add后面括号里要为字符串,不是字符串的直接+""即可
tm.forEach((key, value)-> sj.add(key+"").add("(").add(value+"").add(")"));
System.out.println(sj);
}
}