速学堂第九章作业
答案为个人所写,若有不对之处请指正
一、选择题
- BD
- A 可通过编译,运行时出现异常
- D HashSet底层为HashMap,key不能重复;TreeSet底层为TreeMap红黑树,有序
- C
- 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;
}
}
}
-
实现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;
}
}