java集合-练习题

更新时间:2024-05-02 11:08:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

1. 填空

Collection 接口的特点是元素是___无序可重复______;

List 接口的特点是元素__有__(有|无)顺序,_可以___(可以|不可以)重复; Set 接口的特点是元素__无___(有|无)顺序,____不可以__(可以|不可以)重复; Map 接口的特点是元素是__key、value映射______,其中__value__可以重复,_key___不可以重复。

2. (List)有如下代码 import java.util.*; public class TestList{

public static void main(String args[]){ List list = new ArrayList(); list.add(“Hello”); list.add(“World”); list.add(1, “Learn”); list.add(1, “Java”); printList(list); }

public static void printList(List list){ //1

for(int i = 0; i< list.size();i++){ System.out.println(list.get(i)); }

for(Object o : list) { System.out.println(o); }

Iterator itor = list.iterator(); while(itor.hasNext()){

System.out.println(itor.next()); } } }

要求:

1) 把//1 处的代码补充完整,要求输出list 中所有元素的内容 2) 写出程序执行的结果Hello Java Learn World

3) 如果要把实现类由ArrayList 换为LinkedList,应该改哪里?ArrayList 和 LinkedList 使用上有什么区别?实现上有什么区别?

4) 如果要把实现类由ArrayList 换为Vector,应该改哪里?ArrayList 和Vector 使 用上有什么区别?实现上有什么区别?

3. (List)写出下面程序的运行结果

import java.util.*; public class TestList{

public static void main(String args[]){ List list = new ArrayList(); list.add(“Hello”); list.add(“World”); list.add(“Hello”); list.add(“Learn”); list.remove(“Hello”); list.remove(0);

for(int i = 0; i

结果: Hello Learn

4. (Set,List) import java.util.*;

public class TestListSet{

public static void main(String args[]){ List list = new ArrayList(); list.add(“Hello”); list.add(“Learn”); list.add(“Hello”); list.add(“Welcome”);

Set set = new HashSet(); set.addAll(list);

System.out.println(set.size()); } }

选择正确答案 C A. 编译不通过

B. 编译通过,运行时异常 C. 编译运行都正常,输出3 D. 编译运行都正常,输出4

5. (List)已知有一个Worker 类如下: public class Worker { private int age; private String name; private double salary; public Worker (){}

public Worker (String name, int age, double salary){

this.name = name; this.age = age;

this.salary = salary; }

public int getAge() { return age; }

public void setAge(int age) { this.age = age; }

public String getName() { return name; }

public void setName(String name) { this.name = name; }

public double getSalary(){ return salary; }

public void setSalary(double salary){ this.salary = salary; }

public void work(){

System.out.println(name + “ work”); } }

完成下面的要求

1) 创建一个List,在List 中增加三个工人,基本信息如下: 姓名 年龄 工资 zhang3 18 3000 li4 25 3500 wang5 22 3200

2) 在li4 之前插入一个工人,信息为:姓名:zhao6,年龄:24,工资3300 3) 删除wang5 的信息

4) 利用for 循环遍历,打印List 中所有工人的信息

5) 利用迭代遍历,对List 中所有的工人调用work 方法。

6) 为Worker 类重写equals 方法,当姓名、年龄、工资全部相等时候才返回true

6. (Set,Hash 算法)为上一题的Worker 类,在添加完equals 方法的基础上,添加一个 hashCode 方法。

public int hashCode(){ //1 }

有几种写法:

1) return 0; 2)

int result = 0;

if (name != null) result = name.hashCode(); return result + age;

3) return super.hashCode();

现在要把Worker 类放入HashSet 中,并希望在HashSet 中没有重复元素,则下面说法正 确的是:

A. 三种写法都正确

B. 1), 2)写法正确,2)效率更高 C. 2)写法正确,1),3)写法都不正确

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 set = new HashSet();

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()); } }

8. (Set,Hash 算法)在前面的Worker 类基础上,为Worker 类增加相应的方法,使得

Worker

放入HashSet 中时,Set 中没有重复元素。 并编写相应的测试代码。

9. (Set,Comparable 接口)在前面的Worker 类基础上,为Worker 类添加相应的代码, 使得Worker 对象能正确放入TreeSet 中。并编写相应的测试代码。

注:比较时,先比较工人年龄大小,年龄小的排在前面。如果两个工人年龄相同,则再 比较其收入,收入少的排前面。如果年龄和收入都相同,则根据字典顺序比较工人姓名。例 如:有三个工人,基本信息如下: 姓名 年龄 工资 zhang3 18 1500 li4 18 1500 wang5 18 1600 zhao6 17 2000

放入TreeSet 排序后结果为: zhao6 li4 zhang3 wang5

//Worker

10. (Map)关于下列Map 接口中常见的方法

put 方法表示放入一个键值对,如果键已存在则__覆盖___,如果键不存在则 ____添加_____。

remove 方法接受__1_个参数,表示______key____________。

get 方法表示_______获得key对应的value________________,get 方法的参数表示__key___,返回值表示__value__。

要想获得Map 中所有的键,应该使用方法__keySet_________,该方法返回值类型为____Set__。

要想获得Map 中所有的值,应该使用方法__values_________,该方法返回值类型为_Collection______。

要想获得Map 中所有的键值对的集合,应该使用方法_entrySey__________,该方法返回一个

_Map.Entry_____类型所组成的Set。

11. (Map)利用Map,完成下面的功能:

从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队。如果该 年没有举办世界杯,则输出:没有举办世界杯。

附:世界杯冠军以及对应的夺冠年份,请参考本章附录。 附录

1. 截止到2009 年为止,历届世界杯冠军

2. 2008 北京奥运会男足参赛国家:

科特迪瓦,阿根廷,澳大利亚,塞尔维亚,荷兰,尼日利亚、日本,美国,中国,新西 兰,巴西,比利时,韩国,喀麦隆,洪都拉斯,意大利

Map map=HashMap();

12. (Map)已知某学校的教学课程内容安排如下:

完成下列要求:

1) 使用一个Map,以老师的名字作为键,以老师教授的课程名作为值,表示上述 课程安排。

2) 增加了一位新老师Allen 教JDBC 3) Lucy 改为教CoreJava put方法

4) 遍历Map,输出所有的老师及老师教授的课程(Set>、Set get(key))

5) *利用Map,输出所有教JSP 的老师。

13. (泛型)使用泛型,改写第5 题

14. (泛型)使用泛型和Map.Entry 接口,改写第12 题的前4 问

15. *(List)写出下面程序的输出结果 import java.util.*; class MyClass{ int value;

public MyClass(){}

public MyClass(int value){ this.value = value; } public String toString(){ return “”+value; } }

public class TestList{

public static void main(String args[]){ MyClass mc1 = new MyClass(10); MyClass mc2 = new MyClass(20); MyClass mc3 = new MyClass(30); List list = new ArrayList(); list.add(mc1); list.add(mc2);

list.add(mc3);

MyClass mc4 = (MyClass) list.get(1); mc4.value = 50;

for(int i = 0; i

10 50 30

16. *(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 set = new HashSet();

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

17. *(Set)有如下两个类(只写了类的属性,请自行添加相应的构造方法和get/set 方法)

要求,完善Worker 和Address 类,使得Worker 对象能够正确放入HashSet 中:即将 Worker 放入HashSet 中时不会出现重复元素。并编写相应测试代码。

18. *(Map)在原有世界杯Map 的基础上,增加如下功能: 读入一支球队的名字,输出该球队夺冠的年份列表。 例如,读入“巴西”,应当输出 1958 1962 1970 1994 2002 读入“荷兰”,应当输出 没有获得过世界杯 附录

1. 截止到2009 年为止,历届世界杯冠军

2. 2008 北京奥运会男足参赛国家:

科特迪瓦,阿根廷,澳大利亚,塞尔维亚,荷兰,尼日利亚、日本,美国,中国,新西 兰,巴西,比利时,韩国,喀麦隆,洪都拉斯,意大利

19. *(Map)设计Account 对象如下:

要求完善设计,使得该Account 对象能够自动分配id。 给定一个List 如下:

List list = new ArrayList();

list.add(new Account(10.00, “1234”)); list.add(new Account(15.00, “5678”)); list.add(new Account(0, “1010”));

要求把List 中的内容放到一个Map 中,该Map 的键为id,值为相应的Account 对象。 最后遍历这个Map,打印所有Account 对象的id 和余额。

20. *(List)写一个函数reverseList,该函数能够接受一个List,然后把该List 倒序排列。 例如:

List list = new ArrayList(); list.add(“Hello”); list.add(“World”);

list.add(“Learn”); //此时list 为Hello World Learn reverseList(list);

//调用reverseList 方法之后,list 为Learn World Hello s=list.size()

for(int i=0;i

list.set(s-1-I, set(i,list.get(s-1-i))) }

21. **(Map,Hash 算法)有如下代码: import java.util.*; class MyKey{ int keyValue; public MyKey(){}

public MyKey(int value){this.keyValue = value;} }

class MyValue{ String value;

public MyValue(){}

public MyValue(String value){this.value = value;} public String toString(){return value;} }

public class TestMap{

public static void main(String args[]){ Map map = new HashMap(); MyKey key1 = new MyKey(10);

map.put(new MyKey(10), new MyValue(“abc”)); map.put(new MyKey(10), new MyValue(“cde”)); System.out.println(map.get(key1));

System.out.println(map.size()); } }

写出该代码的输出结果。abc ,2 22. **(Id,hashCode,equals)为Worker 类增加id 属性,用来唯一标识一个员工。即:如果员工的id 不同,则不管其姓名、年龄、工资是否相同,都认为是不同的员工。部分代 码如下:

class Worker{

private final Long id; private String name; private double salary; private int age;

public Worker(long id){ this.id=id; }

public Worker(long id,String name,double salary,int age){ this.id=id; this.name=name; this.salary=salary; this.age=age; }

//构造方法… //get/set 方法…

public boolean equals(Object obj){ //1 此处仅判断id 是否相同 if(obj==null)return false if(obj==this) return true;

if(obj instanceof Worker){ Worker w=(Worker)obj if(w.getId()==this.id){ return true;

} }

return false }

public int hashCode(){ //2 此处返回hashCode return (int)id; }

}

要求:

1) 完善构造方法和get/set 方法。要求自动分配Worker 的id 2) 完善equals 方法。要求仅判断id 是否相同 3) //2 处,如果写成

return (int)(name.hashCode() + id.hashCode() + age + salary); 是否正确?为什么?

23. **(综合)有如下Student 对象

其中,classNum 表示学生的班号,例如“class05”。 有如下List

List list = new ArrayList();

list.add(new Student(“Tom”, 18, 100, “class05”)); list.add(new Student(“Jerry”, 22, 70, “class04”)); list.add(new Student(“Owen”, 25, 90, “class05”)); list.add(new Student(“Jim”, 30,80 , “class05”)); list.add(new Student(“Steve”, 28, 66, “class06”)); list.add(new Student(“Kevin”, 24, 100, “class04”)); 在这个list 的基础上,完成下列要求: 1) 计算所有学生的平均年龄 2) 计算各个班级的平均分 Map> key:班级

value: List

if(!map.constainKey(“class05”)){

List < Integer > list =new Arraylist< Integer >() list.add(100);

map.put(“class05”, list) }else{

List < Integer > list= map.get(“class05”) list.add(90); }

class AA{

int sum; int count; } map

class05 aa{sum:270,count 3} sum/count class04 aa{sum:270,count 3}

class06 aa{sum:270,count 3}

24. **(综合)已知有十六支男子足球队参加2008 北京奥运会。写一个程序,把这16 支球队随机分为4 个组。 注:参赛球队列表见附录

注2:使用Math.random 来产生随机数。 2. 2008 北京奥运会男足参赛国家:

科特迪瓦,阿根廷,澳大利亚,塞尔维亚,荷兰,尼日利亚、日本,美国,中国, 新西兰,巴西,比利时,韩国,喀麦隆,洪都拉斯,意大利

25. **(综合)写一个MyStack 类,表示“栈”这种数据结构。

栈在表示上,就如同一个单向开口的盒子,每当有新数据进入时,都是进入栈顶。其基 本操作为push 和pop。push 表示把一个元素加入栈顶,pop 表示把栈顶元素弹出。 示意图如下:

栈的特点:先进后出。

栈的基本操作:

1) push(Object o):表示把元素放入栈 2) Object pop():返回栈顶元素,并把该元素从栈中删除。如果栈为空,则返回 null 值 3) Object peek():返回栈顶元素,但不把该元素删除。如果栈为空,则返回null值。 4) boolean isEmpty():判断该栈是否为空 5) int size():返回该栈中元素的数量 要求:

1) 利用List,实现栈。

2) 讨论:应当用ArrayList 作为实现类还是用LinkedList?为什么? 附录

1. 截止到2009 年为止,历届世界杯冠军

2. 2008 北京奥运会男足参赛国家:

科特迪瓦,阿根廷,澳大利亚,塞尔维亚,荷兰,尼日利亚、日本,美国,中国,新西 兰,巴西,比利时,韩国,喀麦隆,洪都拉斯,意大利

控制台项目:使用集合来制作学生管理系统

1:系统启动时,创建一个学校,然后给学校一些初始化学生信息、课程信息。

2:学生信息管理(StudentManager) 1.增加学生

2.修改学生 3.删除学生 4.查询学生 5.打印学生 6.课程管理 7.系统退出

3:课程信息管理(CourseManager) 1.增加课程 2.修改课程 3.删除课程

4.通过学生学号,查询该学生选课情况 5.通过课程号,打印当前课程下面学生信息 6.添加选这门课程的学生 7.删除选择这门课程的学生 8.返回上级菜单

主键: 学生:学号 课程:课程号

本文来源:https://www.bwwdw.com/article/9c1g.html

Top