实验十 泛型与集合框架
- 格式:doc
- 大小:74.50 KB
- 文档页数:8
实验⼗泛型程序设计技术实验⼗泛型程序设计技术实验时间 2018-11-1基础知识:1 什么是泛型程序设计?. JDK 5.0 中增加的泛型类型,是Java 语⾔中类型安全的⼀次重要改进。
. 泛型:也称参数化类型(parameterized type),就是在定义类、接⼝和⽅法时,通过类型参数指⽰将要处理的对象类型。
(如ArrayList类). 泛型程序设计(Generic programming):编写代码可以被很多不同类型的对象所重⽤。
2 泛型类的定义:⼀个泛型类(generic class)就是具有⼀个或多个类型变量的类,即创建⽤类型作为参数的类。
如⼀个泛型类定义格式如下:class Generics<K,V>其中的K和V是类中的可变类型参数。
Pair类引⼊了⼀个类型变量T,⽤尖括号(<>)括起来,并放在类名的后⾯。
泛型类可以有多个类型变量。
例如:public class Pair<T, U> { … }类定义中的类型变量⽤于指定⽅法的返回类型以及域、局部变量的类型。
3 泛型⽅法的声明:除了泛型类外,还可以只单独定义⼀个⽅法作为泛型⽅法,⽤于指定⽅法参数或者返回值为泛型类型,留待⽅法调⽤时确定。
– 泛型⽅法可以声明在泛型类中,也可以声明在普通类中。
4 泛型变量的限定:public class NumberGeneric< T extends Number>泛型变量上界的说明,上述声明规定了NumberGeneric类所能处理的泛型变量类型需和Number有继承关系;extends关键字所声明的上界既可以是⼀个类,也可以是⼀个接⼝;List<? super CashCard> cards = new ArrayList<T>();泛型变量下界的说明,通过使⽤super关键字可以固定泛型参数的类型为某种类型或者其超类,当程序希望为⼀个⽅法的参数限定类型时,通常可以使⽤下限通配符。
浙江大学城市学院实验报告课程名称面向对象程序设计实验项目名称集合框架与泛型学生姓名专业班级学号一. 实验目的和要求1. 了解Java集合框架的接口和实现类2. 理解泛型类、泛型接口、泛型方法的特点3. 掌握List<E>接口及其实现类LinkedList<E>、ArrayList<E>4. 了解Set<E>接口及其实现类HashSet<E>、TreeSet<E>5. 了解Map<K,V>及其实现类HashMap<K,V>、TreeMap<K,V>二. 实验内容1. 分析Java集合框架的接口和实现类的组成2. 分析泛型类、泛型接口、泛型方法的特点3. 编程实现:设计学生管理类StudentManager(用List集合管理学生对象)4. 选作-编程实现:设计学生管理类StudentManager(用Set集合管理学生对象)5. 选作-编程实现:设计学生管理类StudentManager(用Map管理学生对象)三. 实验结果与分析(可将程序运行结果截屏,也可分析运行结果)1. 分析Java集合框架的接口和实现类的组成请查阅书籍和Java帮助文档,说明Java集合框架的接口组成以及它们的继承关系,并针对每个接口给出具体的实现类。
答:2. 分析泛型类、泛型接口、泛型方法的特点请查阅书籍和Java帮助文档,举例说明泛型类、泛型接口、泛型方法的特点。
答:3. 编程实现:设计学生管理类StudentManager(用List集合管理学生对象)。
StudentManager类的功能包括添加学生、查询学生、删除学生、统计学生成绩等。
需要设计表示学生对象的Student类,并用LinkedList或ArrayList集合来管理可被数量的学生对象。
另外还需要设计测试类Test来验证StudentManager的功能。
Java语言程序设计C实验报告集合框架及泛型机制学生姓名专业、班级________________________________________ 指导教师 _______________________________________ 成绩_______________________________计算机与信息工程学院年月日一、实验目的学习课程相关章节知识,通过上机练习,掌握以下知识:1.掌握List 接口下ArrayList 及LinkedList 的使用方法。
2.掌握Map 接口下HashMap 及HashTable 的使用方法3.掌握集合中泛型的使用二、实验内容利用集合完成象数据库那样存储数据,并且可以简单查询,利用map 存储学生信息,字段如下:id ,name,age ,实现步骤:(1)创建类,类图如下:2)在main 方法编写逻辑代码3)运行程序并测试结果package ;public class Student {private String name ;private int age ;private String id ;public String getName() {return namepublic void setName(String name ) {this .name = name ;}public int getAge() {return age ;}public void setAge( int age ) {this .age = age ;}public String getId() {return id ;}public void setId(String id) {this .id = id;}public Student(String name , int age , String id ) { super ();this .name = name ;this .age = age ;this .id = id;}public void sayHi(){System. out .println( "name=" + this .getName()+ "age=" + this .getAge()+ " "+ "id=" + this .getId());}//Databace 类package ;import java.util.Collection;import java.util.HashMap;import java.util.Iterator;public class Databace {private Student a;public Databace() {super ();map = new HashMap<String,Student>();}public Student getA() {return a;}public void setA(Student a) {this .a = a;}HashMap<String,Student> map ;public void delete(){ID" );System. out .println( " 请输入要删除表中元素String id =Test. sc.next();if (map .containsKey( id)){map .remove( id);Collection<Student> c= map .values();IteratorvStude nt> it= c.iterator();while (it .hasNext()){a= it .n ext();a.sayHi();}}else{System. out .println("表中没有该元素");}}public void in sert(){System. out .println("按顺序输入id、age、name");String name =Test. sc.next();int age =Test. sc.n ext In t();String id =Test. sc.next();a= new Student( name ,age ,id );map .put( id , a);System. out .println("成功的插入一条记录”);public void update(){System. out .println("请输入要修改表中元素ID");String id =Test. sc.next();if (map .containsKey( id)){map .remove( id);System. out .println("按顺序输入name,age,id");id =Test. sc.next();String name =Test. sc.next();int age =Test. sc.nextInt();a= new Student( id ,age ,name );map .put( id , a);}else{System. out .println("表中没有该元素");}}public void select()System. out .println("请输入要查询的方式 1.查询单行 2.查询全部"); int i=Test. sc.nextInt();switch (i){case 1:{System. out .println("请输入要查询表中元素ID");String id =Test. sc.next();{a= map .get( id);a.sayHi();}else{System. out .println("表中没有该元素");}}break ;case 2:{Collection<Student> c=map .values();Iterator<Student> it= c.iterator();while (it .hasNext()){a= it .next();a.sayHi();}}break ;}}}//testpackage ;import java.util.*;public class Test {/*** @param args */public static Scanner sc= new Scanner(System. public static void main(String[] args ){// TODO Auto-generated method stuint i=0;Databace d = new Databace();while (i==0){int j=Test. sc.nextInt(); switch (j){case 1:d .insert(); breakcase 2: d .select(); breakcase 3: in);System. out .println( System. out .println( System. out .println( System. out .println( System. out .println( "1.储存学生信息") "2.查询学生信息") "3.修改学生信息") "4.删除学生信息") "退出");d .update(); breakcase 4:d .delete(); break default :i=1;}}}}提示:用id 做map 集合的键部分,用student 对象做map 集合的值部分效果显示:三、实验思想四、实验结果五、实验心得。
Java语言程序设计C实验报告集合框架及泛型机制学生姓名专业、班级指导教师成绩计算机与信息工程学院年月日一、实验目的学习课程相关章节知识,通过上机练习,掌握以下知识:1.掌握List接口下ArrayList及LinkedList的使用方法。
2.掌握Map接口下HashMap 及HashTable的使用方法3.掌握集合中泛型的使用二、实验内容利用集合完成象数据库那样存储数据,并且可以简单查询,利用map存储学生信息,字段如下: id ,name,age,实现步骤:(1)创建类,类图如下:(2)在main方法编写逻辑代码(3)运行程序并测试结果package com、cn;public class Student {private String name;private int age;private String 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 getId() {return id;}public void setId(String id) {this、id = id;}public Student(String name, int age, String id) {super();this、name = name;this、age = age;this、id = id;}public void sayHi(){System、out、println("name="+this、getName()+"age="+this、getAge()+" "+"id="+this、getId());}}//Databace类package com、cn;import java、util、Collection;import java、util、HashMap;import java、util、Iterator;public class Databace {private Student a;public Databace() {super();map=new HashMap<String,Student>();}public Student getA() {return a;}public void setA(Student a) {this、a = a;}HashMap<String,Student> map;public void delete(){System、out、println("请输入要删除表中元素ID");String id=Test、sc、next();if(map、containsKey(id)){map、remove(id);Collection<Student> c=map、values();Iterator<Student> it=c、iterator();while(it、hasNext()){a=it、next();a、sayHi();}}else{System、out、println("表中没有该元素");}}public void insert(){System、out、println("按顺序输入id、age、name");String name=Test、sc、next();int age=Test、sc、nextInt();String id=Test、sc、next();a=new Student(name,age,id);map、put(id, a);System、out、println("成功的插入一条记录");}public void update(){System、out、println("请输入要修改表中元素ID");String id=Test、sc、next();if(map、containsKey(id)){map、remove(id);System、out、println("按顺序输入name,age,id");id=Test、sc、next();String name=Test、sc、next();int age=Test、sc、nextInt();a=new Student(id,age,name);map、put(id, a);}else{System、out、println("表中没有该元素");}}public void select(){System、out、println("请输入要查询的方式1、查询单行2、查询全部");int i=Test、sc、nextInt();switch(i){case 1:{System、out、println("请输入要查询表中元素ID");String id=Test、sc、next();if(map、containsKey(id)){a=map、get(id);a、sayHi();}else{System、out、println("表中没有该元素");}}break;case 2:{Collection<Student> c=map、values();Iterator<Student> it=c、iterator();while(it、hasNext()){a=it、next();a、sayHi();}}break;}}}//testpackage com、cn;import java、util、*;public class Test {/*** @param args*/public static Scanner sc=new Scanner(System、in);public static void main(String[] args){// TODO Auto-generated method stuint i=0;Databace d=new Databace();while(i==0){System、out、println("1、储存学生信息");System、out、println("2、查询学生信息");System、out、println("3、修改学生信息");System、out、println("4、删除学生信息");System、out、println("退出");int j=Test、sc、nextInt();switch(j){case 1:d、insert();break;case 2:d、select();break;case 3:d、update();break;case 4:d、delete();break;default:i=1;}}}}提示:用id做map集合的键部分,用student对象做map集合的值部分效果显示:三、实验思想四、实验结果五、实验心得。
《集合框架及泛型》作业一、根据课上讲解内容,完成演示示例和课堂练习1、ArrayList获取并打印新闻标题需求说明:按照以下实现的步骤,使用ArrayList获取和打印新闻标题,显示效果如下图所示:(1)创建多个各类新闻标题对象,包含ID、名称和创建者三个属性;(2)创建存储各类新闻标题的集合对象;(3)按照顺序依次添加各类新闻标题,使用add()方法;(4)获取新闻标题的总数,使用size()方法;(5)根据位置获取相应新闻标题、逐条打印每条新闻标题的名称,使用for 循环遍历。
2、ArrayList存储狗狗信息需求说明:按照以下实现的步骤,使用ArrayList存储狗狗信息,使用ArrayList的方法对狗狗信息进行删除、读取和判断,显示效果如下图所示:(1)存储多条狗信息,获取狗总数,逐条打印出各条狗信息;(2)删除指定位置的狗,使用remove()方法;(3)判断集合中是否包含指定狗,使用contains()方法;3、LinkedList添加和删除新闻标题需求说明:在作业1的基础上,换用LinkedList存储新闻数据,并且使用LinkedList的getFirst()和getLast()方法获取第一条和最后一条数据,以及removeFirst()和removeLast()方法删除第一条和最后一条数据,输出效果如下图所示。
4、集合头尾位置删除和条件狗信息需求说明:按照作业3的实现方式和所用到LinkedList的方法,实现狗狗信息的更新并输出,输出效果如图所示。
5、使用Iterator和增强型for循环遍历Set需求说明:按照以下实现的步骤,使用Iterator和增强型for循环遍历Set,输出效果如下图所示:(1)创建多个各类新闻标题对象,包含ID、名称和创建者三个属性;(2)创建存储各类新闻标题的集合对象;(3)按照顺序依次添加各类新闻标题;(4)获取新闻标题的总数;(5)使用iterator()获取Iterator对象;(6)使用Iterator遍历集合,使用hasNext()方法作为循环条件,判断是否存在另一个可访问的元素;(7)使用增强型for遍历集合;6、HashSet存储狗狗信息需求说明:使用HashSet存储多条狗狗信息,获取狗狗总数,使用Iterator 接口逐条打印出各条狗狗信息,输出效果如图所示。
集合框架:容器:存东西用的。
数组:也是存东西的。
用数组存东西,访问数据速度最快,但修改速度慢。
并且长度不可变。
另外还有一些像链表、树、二叉树、平衡二叉树、红黑树等数据结构。
集合框架就是在这些数据结构之上,加了一些方法,进行包装。
首先记住几个接口(查看API)Collection、Set、List、Map集合框架结构:简略图:集合及其实现类详细图:Collection接口:List接口:(继承Collection接口)List:元素都是有序的(时间顺序),并且元素可以重复。
List集合代表一个有序集合,集合中每个元素都有其对应的的顺序。
允许有重复元素,可以通过索引来访问指定位置的集合元素。
因为List集合默认按元素的添加顺序设置元素的索引,第一次添加的元素索引为0.数组初始化时需要指定大小,而list不需要指定大小。
(可以指定,但不需要指定,指定了也没用)如果不指定大小,它可一直往里边装内容,除非内存装不开。
ArrayList和vector是List接口的经典实现,完全直接list的全部功能。
List接口的具体实现类:ArrayList:List接口的大小可变数组的实现。
除了实现List接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。
下面是ArrayList类的一些方法实例:(具体的可查看API文档)publicclass TestArrayList {publicstaticvoid main(String[] args) {TestArrayList ta = new TestArrayList();ta.test();}publicvoid test(){ArrayList list = new ArrayList();list.add("a");list.add("c");list.add("e");list.add(3, "h");//指定索引处插入// list.remove(1);//指定索引处删除// list.remove("a");//指定具体指删除boolean flag = list.contains("b");//判断集合中是否包含bSystem.out.println(flag);printList(list);}publicvoid printList(List list){for (int i = 0; i < list.size(); i++) {String s = (String) list.get(i);System.out.println(s);}}}Vector:又叫同步容器。
实验十泛型与集合框架1.实验目的1、掌握LinkedList<E>类和Collections类提供的用于排序和查找链表中的数据的方法2、掌握用散列映射来存储数据3、掌握TreeSet<E>类的使用2.实验内容1、根据附录里的源代码,按照注释要求,完成代码填空,使程序能够运行得出结果。
1)实验1 按身高排序2)实验2 英汉小字典3)实验3 演出节目单4)实验4输出args[]中的单词2、设计编写程序完成以下任务。
1)仿照实验1编写TV类,要求通过实现Comparable接口规定该类的对象的大小关系,按price值得大小确定大小关系,即电视机按其价格确定之间的大小关系。
2)从控制台输入若干个单词(输入回车结束)放入集合中,将这些单词排序后(忽略大小写)打印出来。
知识点:List接口的实现类、String常用方法3)请使用LinkedList来模拟一个队列(先进先出的特性):(1)拥有放入对象的方法void put(Object o)(2)取出对象的方法Object get()(3)判断队列当中是否为空的方法boolean isEmpty();并且,编写测试代码,验证你的队列是否正确。
知识点:List接口的实现类LinkedList常用方法4)在一个列表中存储以下元素:apple,grape,banana,pear(1)返回集合中的最大的和最小的元素(2)将集合进行排序,并将排序后的结果打印在控制台上知识点:Collections类中的方法3.实验步骤略4.评分标准1.A——内容功能完善,编程风格好,人机接口界面好;2.B——内容功能完善,编程风格良好,人机接口界面良好;3.C——完成必做内容;4.D——能完成必做内容;5.E——未按时完成必做内容,或者抄袭(雷同者全部为E).参照书上实验按模版要求,将【代码】替换为Java程序代码,编写好完整的程序文档,最后运行得到的相关文件,把实验所得文件一起打包上交。
(压缩包的文件名为:学号后三位和名字开头字母,如109zhh.RAR|ZIP)附录:实验1 按身高排序模板代码Student.javapublic class Student implements Comparable<Student>{int height=0;String name;Student(String n,int h){name=n;height=h;}public int compareTo(Student b){return (this.height-b.height);}}FindStudent.javaimport java.util.*;public class FindStudent {public static void main(String[] args) {List<Student> list=new LinkedList<Student>();list.add(new Student("张三",188));list.add(new Student("李四",178));list.add(new Student("王五",198));Iterator<Student> iter=list.iterator();System.out.println("排序前,链表中的数据");while(iter.hasNext()){Student stu=iter.next();System.out.println(+"身高:"+stu.height);}Collections.sort(list);System.out.println("排序后,链表中的数据");iter=list.iterator();while(iter.hasNext()){Student stu=iter.next();System.out.println(+"身高:"+stu.height);}Student zhaolin=new Student("zhao xiao lin",178);int index=Collections.binarySearch(list,zhaolin,null);if(index>=0){System.out.println(+"和链表中"+list.get(index).name+"身高相同");}}}实验2 英汉小字典模板代码Dictionary.javapublic class Dictionary {public static void main(String[] args) {WindowWord win = new WindowWord();win.setTitle("英汉小字典");}}WindowWord.javaimport java.awt.*;import javax.swing.*;public class WindowWord extends JFrame{JTextField inputText,showText;WordPolice police;WindowWord(){setLayout(new FlowLayout());inputText=new JTextField(6);showText=new JTextField(6);add(inputText);add(showText);police=new WordPolice();police.setJTextField(showText);inputText.addActionListener(police);setBounds(100,100,400,280);setVisible(true);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}}WordPolice.javaimport java.awt.event.*;import javax.swing.*;import java.io.*;import java.util.*;public class WordPolice implements ActionListener {JTextField showText;HashMap<String,String> hashtable;File file=new File("word.txt");Scanner sc=null;WordPolice(){hashtable=new HashMap<String,String>();try{sc=new Scanner(file);while(sc.hasNext()){String englishWord=sc.next();String chineseWord=sc.next();hashtable.put(englishWord, chineseWord);}}catch(Exception e){System.out.print(e.toString());} }public void setJTextField(JTextField showText){this.showText=showText;}public void actionPerformed(ActionEvent e){String englishWord=e.getActionCommand();if(hashtable.containsKey(englishWord)){String chineseWord=hashtable.get(englishWord);showText.setText(chineseWord);}else{showText.setText("没有此单词");}}}实验3 演出节目单模板代码Outer.javaPerform.javapublic class Perform {public static void main(String[] args) {new ShowFrame();}}Program.javaimport java.util.*;public class Program implements Comparable<Program> {Date time=null;String name;Program(String s,int year,int month,int day,int hour,int minute,int second){ name=s;Calendar calendar=Calendar.getInstance();calendar.set(year,month-1,day,hour,minute,second);long n=calendar.getTimeInMillis();time=new Date(n);}public int compareTo(Program b) {int m=0;if(time.equals(b.getDate())){m=0;}else if(time.after(b.getDate())){m=1;}else if(time.before(b.getDate())){m=-1;}return m;}public String getName(){return name;}public Date getDate(){return time;}}ShowFrame.javaimport java.awt.*;import java.awt.event.*;import java.util.*;import javax.swing.*;import java.text.SimpleDateFormat;public class ShowFrame extends JFrame implements ActionListener {JTextArea showArea;JTextField inputName,inputTime;JButton button;TreeSet<Program> treeSet;ShowFrame(){treeSet=new TreeSet<Program>();showArea=new JTextArea();showArea.setFont(new Font("",Font.BOLD,20));inputName=new JTextField(5);inputTime=new JTextField(10);button=new JButton("确定");button.addActionListener(this);JPanel pNorth=new JPanel();pNorth.add(new JLabel("节目名称"));pNorth.add(inputName);pNorth.add(new JLabel("时间(yyyy/mm/dd/hh:mm:ss)"));pNorth.add(inputTime);pNorth.add(button);add(pNorth,BorderLayout.NORTH);add(new JScrollPane(showArea),BorderLayout.CENTER);setSize(500,320);setVisible(true);setDefaultCloseOperation(DISPOSE_ON_CLOSE);validate();}public void actionPerformed(ActionEvent e) {String name=inputName.getText();String time=inputTime.getText();StringTokenizer jiexi=new StringTokenizer(time,"/:");int year=Integer.parseInt(jiexi.nextToken());int month=Integer.parseInt(jiexi.nextToken());int day=Integer.parseInt(jiexi.nextToken());int hour=Integer.parseInt(jiexi.nextToken());int minute=Integer.parseInt(jiexi.nextToken());int second=Integer.parseInt(jiexi.nextToken());Program program=new Program(name,year,month,day,hour,minute,second);treeSet.add(program);show(treeSet);}public void show(TreeSet tree){showArea.setText(null);Iterator<Program> te=treeSet.iterator();while(te.hasNext()){Program pro=te.next();Date date=pro.getDate();SimpleDateFormat matter1=new SimpleDateFormat("yyyy/MM/dd/HH:mm:ss");String time=matter1.format(date);showArea.append(pro.getName()+"(演出时间)"+time+"\n");}}}实验4 输出args[]中的单词模板代码TestArgsWords.javaimport java.util.*;public class TestArgsWords {private static final int ONE = 1;public static void main(String args[]) {Map<String, Integer> m = new HashMap<String, Integer>();for (int i = 0; i < args.length; i++) {if(!m.containsKey(args[i])) {m.put(args[i], ONE);}else {int freq = m.get(args[i]);m.put(args[i], freq + 1);}}System.out.println(m.size() + " distinct words detected:");System.out.println(m);}}。