第九章编程作业

1. 使用List和Map存放多个图书信息,遍历并输出.其中商品属性:编号,名称,单价,出版社;使用商品编号作为Map中的key.

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class TestStoreBookInfo {
    
    
	
	public static void main(String[] args) {
    
    
		
		List<Object> bookList1 = new ArrayList<>();
		bookList1.add("朝花夕拾");
		bookList1.add(10001);
		bookList1.add(21.30);
		bookList1.add("天津人民出版社");
		
		List<Object> bookList2 = new ArrayList<>();
		bookList2.add("人生如逆旅");
		bookList2.add(10002);
		bookList2.add(30.90);
		bookList2.add("四川人民出版社");
		
		List<Object> bookList3 = new ArrayList<>();
		bookList3.add("身份的焦虑");
		bookList3.add(10003);
		bookList3.add(30.80);
		bookList3.add("上海译文出版社");
		
		List<Object> bookList4 = new ArrayList<>();
		bookList4.add("面纱");
		bookList4.add(10004);
		bookList4.add(9.90);
		bookList4.add("开明出版社");
		
		Map<Integer,List<Object>> bookMap = new HashMap<>();
		
		bookMap.put(1001, bookList1);
		bookMap.put(1002, bookList2);
		bookMap.put(1003, bookList3);
		bookMap.put(1004, bookList4);
		
		for(Integer key:bookMap.keySet()) {
    
    
			
			List<Object> booklist = bookMap.get(key);
			
			for(Object bookinfo:booklist) {
    
    
				
				System.out.print(bookinfo + " ");
			}
			System.out.println();
		}
		
	}
	
}

2. 使用HashSet和TreeSet存储多个商品信息,遍历并输出;其中商品属性:编号,名称,单价,出版社

要求向其中添加多个相同的商品,验证集合中元素的唯一性.

提示:向HashSet中添加自定义类的对象信息,需要重写hashCode和equals().

向TreeSet中添加自定义类的对象信息,需要实现Comparable接口,指定比较规则.
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;

public class WorkTest {
    
    
	
	public static void main(String[] args) {
    
    
		
		// 自定义通过id来判断是否是同一个商品
		// 通过自定义hashCode和equals方法实现
		Set<Book> bookSet = new HashSet<>();
		bookSet.add(new Book("朝花夕拾",10001,21.30,"天津人民出版社"));
		bookSet.add(new Book("人生如逆旅",10001,30.90,"四川人民出版社"));
		bookSet.add(new Book("身份的焦虑",10003,30.80,"上海译文出版社"));
		bookSet.add(new Book("身份的焦虑",10002,30.80,"上海译文出版社"));
		
		for(Book bb:bookSet) {
    
    
			System.out.println(bb);
		}
		
		System.out.println("-----------------");
		
		// 通过价格降序排列
		// 通过Comparable接口
		Set<Book> bookSet2 = new TreeSet<>();
		
		bookSet2.add(new Book("朝花夕拾",10001,21.30,"天津人民出版社"));
		bookSet2.add(new Book("人生如逆旅",10002,30.90,"四川人民出版社"));
		bookSet2.add(new Book("身份的焦虑",10003,9.90,"上海译文出版社"));
		bookSet2.add(new Book("面纱",10004,9.90,"开明出版社"));
		
		for(Book bb:bookSet2) {
    
    
			System.out.println(bb);
		}
	}
}

class Book implements Comparable<Book>{
    
    
	
	private String BookName;
	private int Id;
	private double price;
	private String PulishHouse;
	
	public boolean equals(Object obj) {
    
    
		// 判断进行比较的对象是不是Book类的对象
		if (obj instanceof Book) {
    
    
			// 如果是,则将此对象强制转为Book类的对象,并进一步进行判断
			Book newBook = (Book) obj;
			// 判断传入的对象与此对象的ID是否相同,相同则认为是同一本书
			if(this.Id!=newBook.getId()) {
    
    
				// 不相同返回false
				return false;
			}else {
    
    
				return true;
			}	
		}else {
    
    
			return false;
		}
	}
	
	
	public int hashCode() {
    
    
		//hashCode方法返回的是int类型,并且保证返回值要与Book对象的属性有关
		return Id;
	}
	
	public String toString() {
    
    
		return "ID:"+ Id + " BookName:" + BookName + " price:" + price + " publishHouse:" + PulishHouse;
	}
	
	@Override
	public int compareTo(Book o) {
    
    
		// 先通过价格来比较,逆序
		if(this.price>o.getPrice()) {
    
    
			return -1;
		}else if(this.price<o.getPrice()) {
    
    
			return 1;
		}else {
    
    
			// 价格相等时,用Id比较,逆序
			if(this.Id>o.getId()) {
    
    
				return -1;
			}else if(this.Id<o.getId()) {
    
    
				return 1;
			}else {
    
    
				// 都相同时,返回0
				return 0;
			}
			
		}
		
	}
	
	public Book() {
    
    
		
	}
	
	public Book(String bookName, int id, double price, String pulishHouse) {
    
    
		super();
		BookName = bookName;
		Id = id;
		this.price = price;
		PulishHouse = pulishHouse;
	}


	public String getBookName() {
    
    
		return BookName;
	}


	public void setBookName(String bookName) {
    
    
		BookName = bookName;
	}


	public int getId() {
    
    
		return Id;
	}


	public void setId(int id) {
    
    
		Id = id;
	}


	public double getPrice() {
    
    
		return price;
	}


	public void setPrice(double price) {
    
    
		this.price = price;
	}


	public String getPulishHouse() {
    
    
		return PulishHouse;
	}


	public void setPulishHouse(String pulishHouse) {
    
    
		PulishHouse = pulishHouse;
	}
	
}

3. 实现List和Map数据的转换.具体要求如下:

功能1:定义方法public static void listToMap(){}将List中Student元素封装到Map中

     1) 使用构造方法Student(int id,String name,int age,String sex,int age)创建多个学生信息并加入List;

     2) 遍历List,输出每个Student信息;

     3) 将List中数据放入Map,使用Student的id属性作为key,使用Student对象信息作为value;

     4) 遍历Map,输出每个Entry的key和value.

功能2:定义方法public static void mapToList(){}将Map中Student映射信息封装到List

     1) 创建实体类StudentEntry,可以存储Map中每个Entry的信息;

     2) 使用构造方法Student(int id,String name,int age,String sex,int age)创建多个学生信息,
        并使用Student的id属性作为key,存入Map;

     3) 创建List对象,每个元素类型是StudentEntry;

     4) 将Map中每个Entry信息放入List对象.


功能3:说明Comparable接口的作用,并通过分数来对学生进行排序. 
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeSet;

public class OtherTrans {
    
    
	
	public static void main(String[] args) {
    
    
		
		Students stu1 = new Students(10001,"小王",19,"男",120);
		Students stu2 = new Students(10002,"小刘",20,"女",99);
		Students stu3 = new Students(10003,"小芯",18,"女",103);
		
		List<Students> stuList = new ArrayList<>();
		stuList.add(stu1);
		stuList.add(stu2);
		stuList.add(stu3);
		
		listToMap(stuList);
		
		System.out.println("########################");
		
		// Map转List
		Map<Integer,Students> stuMap = new HashMap<>();
		stuMap.put(stu1.getId(), stu1);
		stuMap.put(stu2.getId(), stu2);
		stuMap.put(stu3.getId(), stu3);
		
		mapToList(stuMap);
		
		// 按分数排序(Comparable接口实现)
		Set<Students> stuSet = new TreeSet<>();
		stuSet.add(stu1);
		stuSet.add(stu2);
		stuSet.add(stu3);
		
		System.out.println(stuSet);
	}
	
	public static void mapToList(Map<Integer,Students> stuMap){
    
    
		// 创建元素类型为Entry的List
		List<Entry<Integer,Students>> stulist = new ArrayList<>();
		// 将Map中每个Entry信息放入List对象.
		for(Entry<Integer,Students> stuEntry:stuMap.entrySet()) {
    
    
			stulist.add(stuEntry);
		}
		
		// 遍历List并输出
		for(Entry<Integer,Students> ss:stulist) {
    
    
			System.out.println(ss);
		}
		
	}
	
	public static void listToMap(List<Students> stu){
    
    
		
		Map<Integer,Students> stuMap = new HashMap<>();
		
		// 遍历输出,并添加到map中
		for(Students ss:stu) {
    
    
			System.out.println(ss);
			stuMap.put(ss.getId(), ss);
		}
		
		// 输出key,value
		for(Integer key:stuMap.keySet()) {
    
    
			System.out.println(key+"--------"+stuMap.get(key));
		}
	}
}

class Students implements Comparable<Students>{
    
    
	
	private int id;
	private String name;
	private int age;
	private String sex;
	private int score;
	
	public int compareTo(Students o) {
    
    
		
		if(this.score>o.getScore()) {
    
    
			return -1;
		}else if(this.score<o.getScore()) {
    
    
			return 1;
		}else {
    
    
			if(this.id>o.getId()) {
    
    
				return -1;
			}else if(this.id<o.getId()) {
    
    
				return 1;
			}else {
    
    
				return 0;
			}
		}
	}
	
	
	public String toString() {
    
    
		
		return "id:"+id+" 姓名:"+name+" 年龄:"+age+" 性别:"+sex+" 分数:"+score;
	}
	
	
	public Students() {
    
    
		
	}
	
	public Students(int id, String name, int age, String sex) {
    
    
		
		super();
		this.id = id;
		this.name = name;
		this.age = age;
		this.sex = sex;
		
	}
	
	public Students(int id, String name, int age, String sex, int score) {
    
    
		
		super();
		this.id = id;
		this.name = name;
		this.age = age;
		this.sex = sex;
		this.score = score;
	}

	
	public int getScore() {
    
    
		return score;
	}


	public void setScore(int score) {
    
    
		this.score = score;
	}
	
	public int getId() {
    
    
		return id;
	}
	
	public void setId(int id) {
    
    
		this.id = id;
	}
	
	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 String getSex() {
    
    
		return sex;
	}
	
	public void setSex(String sex) {
    
    
		this.sex = sex;
	}
}


Comparable接口的作用:

TreeSet底层实际是用TreeMap实现的,内部维持了一个简化版的TreeMap,通过key来存储Set的元素. 
TreeSet内部需要对存储的元素进行排序,因此,我们对应的类需要实现Comparable接口.这样,
才能根据compareTo()方法比较对象之间的大小,才能进行内部排序.

猜你喜欢

转载自blog.csdn.net/qq_46456049/article/details/108906630