实验一:
已知集合A={1,2,3,4,5},集合B={1,3,5,7,9},编写程序求A与B的交集、并集和差集。(使用HashSet,查阅JDK API文档)
import java.util.HashSet;
import java.util.Set;
public class HashSetDemo {
public static void main(String args[]) {
HashSet<Integer> a = new HashSet<Integer>();//创建集合a
HashSet<Integer> b = new HashSet<Integer>();//创建集合b
//给a赋值
for (int i=1;i<=5;i++) {
a.add(i);
}
//给b赋值
for(int i = 1;i<10;i+=2) {
b.add(i);
}
//求并集,存放在Union中
HashSet Union = new HashSet<>(a);//将a的值赋给Union
Union.addAll(b);
System.out.println(Union);
//求差集
HashSet difference = new HashSet<>(a);
difference.removeAll(b);
System.out.println(difference);
//求交集
HashSet intersection = new HashSet<>(a);
intersection.retainAll(b);
System.out.println(intersection);
}
}
实验二:
编写一个List集合,添加5个整型对象,获取索引为2的元素并打印输出,再获取其中1个元素的索引,再删除索引为3的元素。
import java.util.ArrayList;
import java.util.List;
public class ListDemo {
public static void main(String args[]) {
List<Integer> ll = new ArrayList<Integer>();//创建一个整型链表
//给链表赋值
for (int i = 0;i<5;i++ ) {
ll.add(i+2);
}
System.out.println("链表为:"+ll);
//打印输出索引为2的元素
System.out.println(ll.get(2));
//获取值为4的索引
System.out.println("元素为4的元素的位置在:"+ll.indexOf(4));
//删除索引为3的元素
ll.remove(3);
//查看链表中的元素
System.out.println("现在的链表为:"+ll);
}
}
实验三:
先设计一个类:Student,包含3个成员变量:学号、姓名、java成绩,用三个参数的构造方法给三个成员变量赋值。使用HashMap()创建一个“key-value”对集合,用来存放Student对象(数据如下表),每个Student对象用该对象的学号作为关键字(key),用迭代器遍历集合所有元素,输出java成绩80分以上元素,并统计元素个数。
姓名 | 学号 | Java成绩 |
马云 | 9011 | 68 |
马化腾 | 9012 | 82 |
李彦宏 | 9013 | 90 |
刘强东 | 9014 | 55 |
周鸿祎 | 9015 | 98 |
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class HashMapDemo {
public static void main(String[] args){
//创建Student数组
Student1[] s = new Student1[]{
new Student1("9011","马云",68),
new Student1("9012","马化腾",82),
new Student1("9013","李彦宏",90),
new Student1("9014","刘强东",55),
new Student1("9015","周鸿祎",98)
};
//创建HashMap
Map<String,Student1> hashmap = new HashMap<String,Student1>();
//给hashmap赋值
for (Student1 i : s){
hashmap.put(i.sno,i);
}
Iterator<String> iterator = hashmap.keySet().iterator();//创建迭代器
int count = 0;//计数
String no= "";//记录键
while(iterator.hasNext()){//判断迭代器下一个是否为空
no=iterator.next();//获取键
if(hashmap.get(no).grade>=80){//判断该键对应的元素的成绩是否不低于80
count++;//不低于八十则加一
System.out.println("学号:"+no+",姓名:"+hashmap.get(no).name+",成绩:"+hashmap.get(no).grade);//输出不低于八十的学生信息
}
}
System.out.println("成绩八十分以上的有:"+count+"个");
}
}
class Student1{//创建Student1类
String sno;
String name;
int grade;
Student1(String sno,String name,int grade){//三个参数的有参构造
this.sno=sno;
this.name=name;
this.grade=grade;
}
}
实验四:
Set集合元素不重复。编写学生类Student,该类有两个属性,no表示学号,name表示姓名。规定两个学生对象的学号相同,则两个对象的值相等。重写hashCode()方法将学号作为哈希码返回,重写equals()方法使学号相同且名字相同的两个对象值相等。写出测试类,满足相同的学生对象不能放入同一个Set集合里。 (使用HashSet)
import java.util.HashSet;
import java.util.Set;
public class TestHashCode {
public static void main(String[] args){
Set<Student2> s = new HashSet<Student2>();//声明HashSet
Student2[] s1= new Student2[]{//创建Student类型数组
new Student2(1,"张三"),
new Student2(2,"李四"),
new Student2(3,"王五"),
new Student2(2,"李四")
};
for (Student2 i :s1){//给HashSet赋值
s.add(i);
}
System.out.println(s.size());//输出s的个数
}
}
class Student2{//创建Student
int no;
String name;
Student2(){//无参构造
}
Student2(int no,String name){//有参构造
this.no=no;
this.name=name;
}
@Override
public int hashCode() {//重写hashCode方法,以学号来算
return no;
}
@Override
public boolean equals(Object obj) {//重写equals方法,姓名和学号相同
Student2 s = (Student2) obj;
return no==s.no&&name.equals(s.name);
}
}
约瑟夫问题
有500个小朋友拉成一个圆圈,从其中一个小朋友开始依次编号1-500,从1号小朋友开始循环1-3报数,数到3的小朋友就退出。编写一个Java应用程序,打印输出依次退出小朋友的编号?(使用LinkedList)
输出结果校验数据:
最后退出的10位小朋友编码为: 409,25,206,367,106,335,133,481,268,436 |
import java.util.LinkedList;
public class Joseph {
public static void main(String[] args){
LinkedList<Integer> link = new LinkedList<Integer>();//创建一个整型集合
for(int i = 0 ;i<500;i++){//给每个位置的编号
link.add(i+1);
}
int i = 0;
int count = 1;//计数
while(link.size()>1){//集合的个数大于1个则继续循环
if(i>link.size()-1){//判断当前有无出界
i=0;//出界则重新开始新的一圈
}
if(count==3){//判断这个人是否出界
System.out.println(link.get(i)+"号出列");
link.remove(i);//移除这个人
if(i> link.size()-1){//判断移除后是否出界,
i=0;//出界则重新开始一轮
}
count=1;//重新开始计数
}
i++;//下标后移
count++;//下一个人报的数
}
System.out.println("最后一个出列的是"+link.get(0));
}
}
统计次数:
随机产生范围在[1,50]的100个整数,并统计出每个整数出现的次数,请写出完整的java代码。(使用HashMap)
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Random;
public class TestHashMap {
public static void main(String[] args){
int[] arr = new int[100];//创建一个存放随机整数的数组
Map<Integer,Integer> random = new HashMap<Integer,Integer>();//创建一个整型的HashMap
Random r = new Random();//创建一个随机数对象
for(int i = 0;i<100;i++){//数组赋值
int number = r.nextInt(1,51);
arr[i]=number;
System.out.println(arr[i]);//查看数组中的元素
}
for (int i :arr){
Integer integer = random.get(i);//查看random中是否以及存在i这个值
if(integer==null){//如果不存在,则将此值放入HashMap中
random.put(i,1);
}
else//存在则计数加一
random.put(i,integer+1);
}
System.out.println(random);//输出查看各个整数出现的次数
}
}