学习任务:

视频学习

测试Map转为Set

在项目中常会将Map转为Set,Map接口中有如下方法进行转换:

//将map中所有的key转为set集合
Set<K> keySet();
//将map中所有元素转为set集合
Set<Map.Entry<K, V>> entrySet();
//将map中所有value转成Collection视图
Collection<V> values();

下边对Map转换Set的API方法进行测试,如下:

PbCourse类如下:

注意编写hashCode()方法及equals()方法。

package com.pbteach.javase.oop.map.test2;

import java.util.Objects;

/**
 * 	课程类
 * @author 攀博课堂(www.pbteach.com)
 *
 */
public class PbCourse {
	
	//课程标识
	private long id;
	//课程名称
	private String courseName;
	//课程价格
	private int price;
	
	public PbCourse() {
		
	}
	public PbCourse(long id, String courseName, int price) {
		this.id = id;
		this.courseName = courseName;
		this.price = price;
	}
	public long getId() {
		return id;
	}
	public void setId(long id) {
		this.id = id;
	}
	public String getCourseName() {
		return courseName;
	}
	public void setCourseName(String courseName) {
		this.courseName = courseName;
	}
	public int getPrice() {
		return price;
	}
	public void setPrice(int price) {
		this.price = price;
	}

	@Override
	public boolean equals(Object o) {
		if (this == o) return true;
		if (o == null || getClass() != o.getClass()) return false;
		PbCourse pbCourse = (PbCourse) o;
		return id == pbCourse.id &&
				Objects.equals(courseName, pbCourse.courseName);
	}

	@Override
	public int hashCode() {
		return Objects.hash(id, courseName);
	}

	@Override
	public String toString() {
		return "PbCourse [id=" + id + ", courseName=" + courseName + ", price=" + price + "]";
	}

	
	

}

测试代码如下:

package com.pbteach.javase.oop.set.test1;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import com.pbteach.javase.oop.map.test2.PbCourse;
import com.pbteach.javase.oop.map.test2.PbStudent;


/**
 * map转为set
 * @author 攀博课堂(www.pbteach.com)
 *
 */
public class HashSetTest2 {
	
	public static void main(String[] args) {
		 //定义一个HashMap
		Map<Long,PbCourse> map = new HashMap<>();

        //添加元素,key为PbCourse类型,value为List类型(这里主要是测试对key的排序,value设为空列表)
		map.put(100L,new PbCourse(100L, "攀博课堂-Java面向对象教程", 33));
		map.put(102L,new PbCourse(102L, "攀博课堂-SpringCloud微服务教程", 55));
		map.put(101L,new PbCourse(101L, "攀博课堂-Spring全家桶教程", 44));
		map.put(103L,new PbCourse(103L, "攀博课堂-在线教育分布式项目教程", 66));
		map.put(104L,new PbCourse(100L, "攀博课堂-Java面向对象教程", 22));
		//将map的key转成set
		System.out.println("===========将map的key转成set==========");
		Set<Long> keySet = map.keySet();
		//遍历keySet
		keySet.forEach(System.out::println);
		//将map的元素转成set
		System.out.println("===========将map的元素转成set==========");
		Set<Entry<Long,PbCourse>> entrySet = map.entrySet();
		//遍历entrySet
		entrySet.forEach(entry->{
			//取出key
			Long key = entry.getKey();
			//取出value
			PbCourse value = entry.getValue();
			System.out.println(key+"-->"+value);
		});
		//遍历value
		System.out.println("===========将map的value转成set==========");
		Collection<PbCourse> values = map.values();
		values.forEach(System.out::println);
		//values去重
		System.out.println("===========values去重==========");
		HashSet<PbCourse> valuesSet = new HashSet<PbCourse>(values);
		valuesSet.forEach(System.out::println);
	}

}

输出:

===========将map的key转成set==========
100
101
102
103
104
===========将map的元素转成set==========
100-->PbCourse [id=100, courseName=攀博课堂-Java面向对象教程, price=33]
101-->PbCourse [id=101, courseName=攀博课堂-Spring全家桶教程, price=44]
102-->PbCourse [id=102, courseName=攀博课堂-SpringCloud微服务教程, price=55]
103-->PbCourse [id=103, courseName=攀博课堂-在线教育分布式项目教程, price=66]
104-->PbCourse [id=100, courseName=攀博课堂-Java面向对象教程, price=33]
===========将map的value转成set==========
PbCourse [id=100, courseName=攀博课堂-Java面向对象教程, price=33]
PbCourse [id=101, courseName=攀博课堂-Spring全家桶教程, price=44]
PbCourse [id=102, courseName=攀博课堂-SpringCloud微服务教程, price=55]
PbCourse [id=103, courseName=攀博课堂-在线教育分布式项目教程, price=66]
PbCourse [id=100, courseName=攀博课堂-Java面向对象教程, price=33]
===========values去重==========
PbCourse [id=102, courseName=攀博课堂-SpringCloud微服务教程, price=55]
PbCourse [id=103, courseName=攀博课堂-在线教育分布式项目教程, price=66]
PbCourse [id=101, courseName=攀博课堂-Spring全家桶教程, price=44]
PbCourse [id=100, courseName=攀博课堂-Java面向对象教程, price=33]

注意:调用map的values()方法并不是转成set集合,所以调用values()方法得到的元素有重复的现象,如果要去重需要转成set集合。

由于 equals方法是根据课程id及课程名称比较两门课程是否相等,所以 new PbCourse(100L, "攀博课堂-Java面向对象教程", 22)课程添加Map失败。

提问-攀博课堂
我要提问 不会就问,有效沟通
关注公众号,加入微信群交流提问。 攀博课堂官方公众号
问答列表,查看本知识点所有问题