速学堂第九章作业

答案为个人所写,若有不对之处请指正

一、选择题

  1. BD
  2. A 可通过编译,运行时出现异常
  3. D HashSet底层为HashMap,key不能重复;TreeSet底层为TreeMap红黑树,有序
  4. C
  5. C
    二、略
    三、编码题
    1.使用List和Map存放多个图书信息,遍历并输出。其中商品属性:编号,名称,单价,出版社;使用商品编号作为Map中的key。
package com.jieonli;

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

/**
 * 使用List和Map存储图书信息表
 * 每一行用List存储
 * 整个表用Map存储
 * @author jieonli
 *
 */

public class BooksMessageTable {
	
	public static void main(String[] args) {
		
		List<String> row1 = new ArrayList<>();
		row1.add("深入理解计算机");
		row1.add("139.00");
		row1.add("机械工业出版社");
		
		List<String> row2 = new ArrayList<>();
		row2.add("java核心技术卷1");
		row2.add("100.00");
		row2.add("工业出版社");
		
		List<String> row3 = new ArrayList<>();
		row3.add("python深度学习");
		row3.add("69.00");
		row3.add("机械出版社");
		
		Map<String, List> bookTable =  new HashMap<>();
		bookTable.put("1001", row1);
		bookTable.put("1002", row2);
		bookTable.put("1003", row3);
		
		//使用迭代器Interator遍历
		System.out.println("编号\t"+"书名\t\t"+"价格\t"+"出版社");
		Set<String> keyset = bookTable.keySet(); 
		for(Iterator<String> iter1=keyset.iterator();iter1.hasNext();) {
			String key = iter1.next();
			List<String> row = bookTable.get(key);
			System.out.print(key+"\t");
			for(Iterator<String> iter2=row.iterator();iter2.hasNext();) {
				String value = iter2.next();
				System.out.print(value+"\t");
			}
			System.out.println();	
		}	
	}
}

2.使用HashSet和TreeSet存储多个商品信息,遍历并输出;其中商品属性:编号,名称,单价,出版社;要求向其中添加多个相同的商品,验证集合中元素的唯一性。
提示:向HashSet中添加自定义类的对象信息,需要重写hashCode和equals( )。
向TreeSet中添加自定义类的对象信息,需要实现Comparable接口,指定比较 规则。
使用HashSet

package com.jieonli;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

/**
 * 用HashSet存放自定义类型
 * 重写hashCode()与equals()
 * 因为HashSet的底层时HashMap
 * @author jieonli
 *
 */

public class ProductOfHashSet {
	
	public static void main(String[] args) {
		
		Set<Book> bookset = new HashSet<>();
		bookset.add(new Book("1001", "python深度学习", 39.00, "机械工业出版社"));
		bookset.add(new Book("1002", "深入理解计算机", 139.00, "工业出版社"));
		bookset.add(new Book("1002", "深入理解计算机", 139.00, "工业出版社"));

		//遍历输出
		for(Iterator<Book> iter=bookset.iterator();iter.hasNext();) {
			Book book = iter.next();
			System.out.println(book.toString());
		}

	}
}

class Book{
	String id;
	String name;
	double price;
	String publisher;
	
	public Book(String id,String name,double price,String publisher){
		this.id = id;
		this.name = name;
		this.price = price;
		this.publisher = publisher;
	}
	
	
	@Override
	public boolean equals(Object obj) {
		Book obj2 = (Book)obj;
		if(this.hashCode()==obj2.hashCode()) {
			return true;
		}
		return false;

	}
	
	@Override
	public int hashCode() {
		
		StringBuilder sb = new StringBuilder();
		sb.append(id);
		sb.append(name);
		sb.append(""+price);
		//sb.append(String.valueOf(price));
		sb.append(publisher);
		
		char[] charArr = sb.toString().toCharArray();
		int hash = 0;
		
		for(char c:charArr) {
			hash = hash*131 + c;
		}
		
		return hash;
	
	}
	
	@Override
	public String toString() {
		return id+"  "+name+"  "+price+"  "+publisher;
	}

}

使用TreeSet

package com.jieonli;

import java.util.Set;
import java.util.TreeSet;

/**
 * TreeSet存放自定义类型
 * 自定义类型需要继承Comparable,重写Comparato方法
 * TreeSet与TreeMap都不需要重写hashCode(),因为没用到
 * @author jieonli
 *
 */

public class ProductOfTreeSet {
	
	public static void main(String[] args) {
		
		Set<NewBook> set = new TreeSet<>();
		
		set.add(new NewBook("1002", "深入理解计算机", 139.00, "工业出版社"));
		set.add(new NewBook("1001", "python深度学习", 39.00, "机械工业出版社"));
		set.add(new NewBook("1002", "深入理解计算机", 139.00, "工业出版社"));
		set.add(new NewBook("1003", "深入理解计算机", 139.00, "工业出版社"));
		System.out.print(set);	
	}

}

class NewBook extends Book implements Comparable<NewBook>{

	public NewBook(String id, String name, double price, String publisher) {
		super(id, name, price, publisher);
	}
	@Override
	public int compareTo(NewBook o) {
		if(this.id.compareTo(o.id)>0){
			return 1;
		}else if(this.id.compareTo(o.id)<0) {
			return -1;
		}else {
		return 0;
		}
	}

}

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

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

      1) 使用构造方法Student(int id,String name,int age,String sex )创建多个学生信息并加入List;
    
       2) 遍历List,输出每个Student信息;
    
       3) 将List中数据放入Map,使用Student的id属性作为key,使用Student对象信息作为value;
    
       4) 遍历Map,输出每个Entry的key和value。
    

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

       1) 创建实体类StudentEntry,可以存储Map中每个Entry的信息;
    
       2) 使用构造方法Student(int id,String name,int age,String sex )创建多个学生信息,并使用Student的id属性作为key,存入Map;
    
       3) 创建List对象,每个元素类型是StudentEntry;
    
       4) 将Map中每个Entry信息放入List对象。
    

    功能3:说明Comparable接口的作用,并通过分数来对学生进行排序。

package com.jieonli;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * List与Map数据互换
 * @author jieonli
 *
 */

public class ListMapInterchange {

	public void listToMap(List<Student> list,Map<Integer,Student> map) {
		//遍历list并将数据存入map
		for(Iterator<Student> iter=list.iterator();iter.hasNext();) {
			Student stu = iter.next();
			System.out.println(stu.toString());
			map.put(Integer.valueOf(stu.id), stu);
		}
		
	}
	
	public void mapToList(Map<Integer,Student> map,List<Student> list) {
		//遍历map并将数据存入list
		Set<Integer> keyset = map.keySet();
		for(Iterator<Integer> iter=keyset.iterator();iter.hasNext();) {
			Integer key = iter.next();
			list.add(map.get(key));
			
		}
		
	}
	
	public static void main(String[] args) {
		
		Student stu1 = new Student(1001, "张三", 18, "男");
		Student stu2 = new Student(1010, "李四", 19, "男");
		Student stu3 = new Student(1003, "小红", 20, "女");
		List<Student> list = new ArrayList<>();
		list.add(stu1);
		list.add(stu2);
		list.add(stu3);

		Map<Integer, Student> map = new HashMap<>();

		new ListMapInterchange().listToMap(list, map);

		//遍历map
		Set<Integer> keyset = map.keySet();
		for(Iterator<Integer> iter=keyset.iterator();iter.hasNext();) {
			Integer key = iter.next();
			System.out.println("key:"+key+"\t"+"value:"+map.get(key));
		}
		
		List<Student> list2 = new ArrayList<>();
		new ListMapInterchange().mapToList(map, list2);
		
		System.out.println("----------------------");
		//遍历list
		for(Iterator<Student> iter=list2.iterator();iter.hasNext();) {
			Student stu = iter.next();
			System.out.println(stu);
		}
		
		//排序
		Collections.sort(list2);
		System.out.println(list2);
	}
	
}

class Student implements Comparable<Student>{
	int id;
	String name;
	int age;
	String sex;
	
	public Student(int id, String name, int age, String sex) {
		super();
		this.id = id;
		this.name = name;
		this.age = age;
		this.sex = sex;
	}
	
	@Override
	public int compareTo(Student o) {
		if(this.id>o.id) {
			return 1;
		}else if(this.id<o.id) {
			return -1;
		}else {
		return 0;
		}
	}
	
	@Override
	public String toString() {
		return id+"  "+name+"  "+age+"  "+sex;
	}
}