努力到无能为力,拼搏到感动自己!
加油!
集合中的Set和Map
特点是无序,无下标,集合元素不重复
4.(Set,List)
import java.util.*;
public class TestListSet{
public static void main(String args[]){
List<String> list = new ArrayList<String>();
list.add(“Hello”);
list.add(“Learn”);
list.add(“Hello”);
list.add(“Welcome”);
Set<String> set = new HashSet<String>();
set.addAll(list);
System.out.println(set.size());
}
}
选择正确答案
A. 编译不通过
B. 编译通过,运行时异常
C. 编译运行都正常,输出 3
D. 编译运行都正常,输出 4
C
6.(Set,Hash 算法)为上一题的 Worker 类,在添加完 equals 方法的基础上,添加一个 hashCode 方法。
public int hashCode(){
//1
}
有几种写法:
I. return 0;
Ⅱ.int result = 0;
if (name != null) result = name.hashCode();
return result + age;
III. return super.hashCode();
现在要把 Worker 类放入 HashSet 中,并希望在 HashSet 中没有重复元素,则下面说法正确的是:
A.三种写法都正确
B.I、II 写法正确,II 的效率更高
C.II 写法正确,I、III 写法都不正确
B
7.(Set,Hash 算法,方法覆盖)代码改错
import java.util.*;
class Worker{
String name;
int age;
double salary;
public Worker(){}
public Worker(String name, int age, double salary){
this.name = name;
this.age = age;
this.salary = salary;
}
int hashCode(){
return name.hashCode() + age + salary;
}
public boolean equals(Worker w){
if (w.name == name && w.salary == salary && w.age == age){
return true;
}else{
return false;
}
}
}
public class TestWorker{
public static void main(String args[]){
Set<Worker> set = new HashSet<Worker>();
set.add(new Worker(“tom”, 18, 2000));
set.add(new Worker(“tom”, 18, 2000));
set.add(0, new Worker(“jerry”, 18,2000));
System.out.println(set.size());
}
}
//1.重写父类方法,权限不能小于父类
public int hashCode(){
//2.HashSet是无序的集合,不能在指定位置添加
set.add(0, new Worker(“jerry”, 18, 2000));
8.(Set,Hash 算法)在前面的 Worker 类基础上,为 Worker 类增加相应的方法,使得 Worker 放入HashSet 中时,Set 中没有重复元素。并编写相应的测试代码。
import java.util.HashSet;
import java.util.Set;
class Worker{
String name;
int age;
double salary;
public Worker() {}
public Worker(String name, int age, double salary) {
this.name = name;
this.age = age;
this.salary = salary;
}
@Override
public String toString() {
return "Worker [name=" + name + ", age=" + age + ", salary=" + salary + "]";
}
@Override
public int hashCode() {
return name.hashCode() + age + (int)salary;
}
public boolean equals(Worker w) {
if(this.name.equals(w.name) && w.salary == this.salary && w.age == this.age) {
return true;
}else{
return false;
}
}
@Override
//判别类型
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (this.getClass() != obj.getClass()) {
return false;
}
Worker w = (Worker) obj;
if(this.name.equals(w.name) && w.salary == this.salary && w.age == this.age) {
return true;
}else{
return false;
}
}
}
public class TestWorker {
public static void main(String[] args) {
Set<Worker> set = new HashSet<Worker>();
set.add(new Worker("tom" , 18 , 2000));
set.add(new Worker("mack" , 21 , 3000));
set.add(new Worker("jerry" , 18 , 2000));
System.out.println(set.size());
for (Worker w : set) {
System.out.println(w.toString());
}
}
}
9.(Map)关于下列 Map 接口中常见的方法:
1) put 方法表示放入一个键值对,如果键已存在则_**新值替换旧值**_,如果键不存在则__**创建一个键值对**_。
2)remove 方法接受__**一个**___个参数,表示__**删除一个键值对**__。
3)get 方法表示__**通过键值查找**___,get 方法的参数表示__**键名**__,返回值表示__**键的名**__。
4)要想获得 Map 中所有的键,应该使用方法__**keyset**__,该方法返回值类型为__**set**__。
5)要想获得 Map 中所有的值,应该使用方法__**value**__,该方法返回值类型为__**Collcetions**__。
10.(Map)利用 Map,完成下面的功能:
从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队。如果该年没有举办世界杯,则输出:没有举办世界杯。
附录:截止 2009 年,历届世界杯冠军、世界杯冠军以及对应的夺冠年份:
public class TestWorldCup {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("2006", "意大利");
map.put("2002", "巴西");
map.put("1998", "法国");
map.put("1994", "巴西");
map.put("1990", "德国");
map.put("1986", "阿根廷");
map.put("1982", "意大利");
map.put("1978", "阿根廷");
map.put("1974", "德国");
map.put("1970", "巴西");
map.put("1966", "英格兰");
map.put("1962", "巴西");
map.put("1958", "巴西");
map.put("1954", "德国");
map.put("1950", "乌拉圭");
map.put("1938", "意大利");
map.put("1934", "意大利");
map.put("1930", "乌拉圭");
Scanner input = new Scanner(System.in);
System.out.print("输入一个年份:");
String str = input.next();
if (map.containsKey(str)) {
System.out.println("该年世界杯冠军是:" + map.get(str));
} else {
System.out.println("没有举办世界杯");
}
}
}
11.(Map)已知某学校的教学课程内容安排如下:
老师课程
TomCoreJava
John Oracle
Susan Oracle
Jerry JDBC
Jim Unix
Kevin JSP
Lucy JSP
完成下列要求:
1)使用 Map,以老师的名字作为键,教授的课程名作为值,表示上述课程安排。
2)增加了一位新老师 Allen 教 JDBC
3)Lucy 改为教 CoreJava
4)遍历 Map,输出所有的老师及老师教授的课程
5)利用 Map,输出所有教 JSP 的老师。
public class TestMap {
public static void main(String[] args) {
Map<String,String> map = new HashMap<String, String>();
//1.使用Map,以老师名字作为键,教授的课程名作为值,表示上述课程安排
map.put("Tom","CoreJava");
map.put("John","Oracle");
map.put("Susan","Oracle");
map.put("Jerry","JDBC");
map.put("Jim","Unix");
map.put("Kevin","JSP");
map.put("Lucy","JSP");
//2.增加一位新教师Allen教JDBC
map.put("Allen", "JDBC");
//3.Lucy改为教CoreJava
map.put("Lucy", "CoreJava");
//4.输出所有老师及老师教授的课程
Set<String> keySet = map.keySet();
Iterator<String> iterator = keySet.iterator();
System.out.println("老师"+"\t"+"课程");
while (iterator.hasNext()) {
String key = (String) iterator.next();
System.out.println(key+"\t"+map.get(key));
}
//5.输出所有教JSP的老师
System.out.println("教JSP的老师");
for(String key:keySet) {
if(map.get(key).equals("JSP")) {
System.out.println(key);
}
}
}
}
12.(Set,HashSet,空指针)有下面代码
import java.util.*;
class Student {
int age;
String name;
public Student(){}
public Student(String name, int age){
this.name = name;
this.age = age;
}
public int hashCode(){
return name.hashCode() + age;
}
public boolean equals(Object o){
if (o == null) return false;
if (o == this) return true;
if (o.getClass() != this.getClass())
return false;
Student stu = (Student) o;
if (stu.name.equals(name) && stu.age == age)
return true;else return false;
}
}
public class TestHashSet{
public static void main(String args[]){
Set<Student> set = new HashSet<Student>();
Student stu1 = new Student();
Student stu2 = new Student(“Tom”, 18);
Student stu3 = new Student(“Tom”, 18);
set.add(stu1);
set.add(stu2);
set.add(stu3);
System.out.println(set.size());
}
}
下列说法正确的是:
A.编译错误
B.编译正确,运行时异常
C.编译运行都正确,输出结果为 3
D.编译运行都正确,输出结果为 2
B 空指针异常
13.(Map)在原有世界杯 Map 的基础上,增加如下功能:读入一支球队的名字,输出该球队夺冠的年份列表。
例如:
1)读入“巴西”,应当输出 1958、1962、1970、1994、2002
2)读入“荷兰”,应当输出”没有获得过世界杯”。
//思路:每一年只能有一个冠军,所以用年份来做key,用冠军来做value
import java.util.HashMap;
import java.util.Scanner;
public class Map {
public static void main(String[] args) {
java.util.Map<String, String> m1 = new HashMap<>();
m1.put("1930", "乌拉圭");
m1.put("1934", "意大利");
m1.put("1938", "意大利");
m1.put("1950", "乌拉圭");
m1.put("1954", "西德");
m1.put("1958", "巴西");
m1.put("1962", "巴西");
m1.put("1966", "英格兰");
m1.put("1970", "巴西");
m1.put("1974", "西德");
m1.put("1978", "阿根廷");
m1.put("1982", "意大利");
m1.put("1986", "阿根廷");
m1.put("1990", "西德");
m1.put("1994", "巴西");
m1.put("1998", "法国");
m1.put("2002", "巴西");
m1.put("2006", "意大利");
m1.put("2010", "西班牙");
m1.put("2014", "德国");
Scanner sc = new Scanner(System.in);
System.out.println("请输入年份");
String str = sc.nextLine();
if(m1.containsKey(str)==false){
System.out.println(str+"年没有举办世界杯");
} else {
System.out.println(str+"年的夺冠球队是:"+m1.get(str));
}
Scanner sc1 = new Scanner(System.in);
System.out.println("请输入夺冠球队");
String str1 = sc1.nextLine();
if(m1.containsValue(str1)==false) {
System.out.println(str1+"队没有获得过冠军");
} else {
System.out.println(str1+"队的夺冠年份是:");
for(String k :m1.keySet()) {
if(m1.get(k).equals(str1)){
System.out.print(" "+k);
}
}
}
}
}
14.(Map) 给定一个字符串,请输出该字符串由哪些字符组成,每个字符出现几次?
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class TestMap {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入字符串:");
String str = scanner.next();
Map<Character , Integer> map = new HashMap<Character , Integer>();
for (int i = 0; i < str.length(); i++) {
Character ch = str.charAt(i);
if(map.get(ch) == null) {
map.put(ch, 1);
}else {
int in = map.get(ch);
map.put(ch, in + 1);
}
}
System.out.println(map.entrySet());
}
}