Java实验六
admin
2024-02-16 10:29:10
0

前言:

本次我在每个实验题下面都简单的写了一下思路解析,希望同学们先看看思路解析后尽量尝试自己做一下,不要只是简单的Ctrl c + Ctrl v,如果有疑惑的地方也欢迎找我来探讨呀🎈。

实验一:

1、将下列数据:“hello”、123、6.9、“hello”、“”、“Hello”、StringBuffer s=new StringBuffer(“hello”)中的s,添加到一个ArrayList对象中。。

• 将ArrayList中的所有元素打印输出。

• 查找元素“hello”。

• 删除指定的元素“hello”。

• 将元素123替换为1000。

思路解析:

  • 可以看出本题主要考察ArrayList的常用方法
  • 遍历的三种方式:普通for循环;增强for循环;iterator迭代
  • 使用for循环查找元素下标,但是需要注意集合中可能不止一个元素,即符合的下标不为一,我们可以再创建一个集合存储下标
  • ArrayList的remove方法,删除元素
  • ArrayList的set方法,修改元素

源代码:

public static void main(String[] args) {ArrayList list = new ArrayList<>();list.add("hello");list.add(123);list.add(6.9);list.add("hello");list.add("");list.add("Hello");StringBuffer s=new StringBuffer("hello");list.add(s);//将ArrayList中的所有元素打印输出。//这里使用集合的迭代器方法遍历输出,同样可以使用for循环与增强for循环System.out.print("遍历list: ");Iterator iterator = list.iterator();while (iterator.hasNext()){System.out.print(iterator.next()+" ");}System.out.println();/*查找元素“hello”。因为不太理解题目查找的意思,姑且理解为寻找相应元素的下标我这里新建了一个集合index,通过遍历list找到"hello"元素并将索引添加到index这里需要注意的是StringBuffer类与String不同,所以list中添加的s并不属于查找范围*/ArrayList index = new ArrayList<>();for(int i =0;iif(list.get(i).equals("hello")){index.add(i);}}System.out.println("hello在list中的下标为:"+index);//删除指定的元素“hello”。直接用集合类的remove方法即可list.remove("hello");//将元素123替换为1000,通过遍历得到123元素的下标并调用集合中的set方法for(int i = 0 ;i< list.size();i++){if(list.get(i).equals(123)){list.set(i,1000);}}
}
 

实验二:

2、使用ArrayList集合,向集合中添加10个整数,并使用Iterator遍历该集合,并查找键盘输入的元素。提示:

• 使用add()方法将元素添加到ArrayList集合中。

• 调用集合的iterator()方法获得Iterator对象,并调用Iterator的hasNext()和next()方法,迭代出集合中的所有元素,完成查找功能,并将重复的元素删除。

思路解析:

  • 本题考查Iterator迭代遍历集合
  • 似曾相识的查找功能,这次没有像上一题用一个集合存放下标,而是直接输出,这种做法是不如用一个集合存放下标的,赶快自己修改一下吧
  • 删除重复元素,大家应该能很自然的想到双重for循环,再用remove删除,但本题指明要用Iterator,那就只能Iterator下面再套一个for循环了,需要注意的是在Iterator中删除元素必须用iterator.remove(),不然会出现严重的空指针错误,如果你还不清楚为什么快去查一查吧o( ̄▽ ̄)ブ

源代码:

public static void main(String[] args) {ArrayList List = new ArrayList<>();//使用ArrayList集合,向集合中添加10个整数,for(int i = 0;i<5;i++){List.add(i);List.add(i);}System.out.println(List);//list:[0, 0, 1, 1, 2, 2, 3, 3, 4, 4]//查找功能Scanner sc=new Scanner(System.in);System.out.println("请输入要查找的数据:");int n =sc.nextInt();for (int i = 0; i < List.size(); i++) {if(n==List.get(i)){System.out.println(n+"的位置在:"+i);}}//将重复的元素删除Iterator iterator = List.iterator();while (iterator.hasNext()){int num = iterator.next();//得到当前元素int count = 0;//计数//遍历集合,找到相同元素增加计数for(int i = 0;i< List.size();i++){if(List.get(i)==num){count++;}}//利用iterator的remove()把当前元素删除if(count>1){iterator.remove();}}System.out.println("去除重复元素后: "+List);

实验三:

3、分别利用Arraylist和Set随机生成十个不重复的随机整数,随机整数范围为350到450。

思路分析:

  • 这道题主要考察用Random类生成随机数
  • 需要注意Arraylist可以添加重复元素,所以在添加到时候需要判断是否已经含有此元素,可以用到contains方法
  • Set集合不能添加重复元素,内部已经完成去重,不用判断随便放就好

源代码:

public static void main(String[] args) {/*分别利用Arraylist和Set随机生成十个不重复的随机整数,随机整数范围为350到450。*/Random random = new Random();ArrayList list = new ArrayList<>();while (list.size()<10){int num = random.nextInt(350,450);//判断当前list中是否已经包含生成的随机数if(!list.contains(num)){list.add(num);}}System.out.println("Arraylist的十个随机数:"+list);Set set = new HashSet<>();while (set.size()<10){int num = random.nextInt(350,450);//因为Set本事内部已经去重,无法添加相同的元素所以这里不需要再判断set.add(num);}System.out.println("Set的十个随机数: "+set);
}

实验四:

4、集合中不容许有重复的对象,对于多个重复对象只能添加一次。例如在HashSet集合中添加三个Person对象,把姓名相同的人当做同一个人,虽然可以添加多次但集合里只保留一个,但是这对类的设计是有要求的,假设Person类中只包含name和age属性,则需要重写hashCode()方法和equals()方法,如果两个对象的name相同,则hashCode()方法的返回值相同,equals()方法返回true。

思路解析:

  • 这道题考察Set集合存放自定义类需要重写hashCode()方法和equals()方法,关于Set的存放问题涉及其内部源码这里简单解释一下

HashSet在存储元素的过程中首先会去调用元素的hashCode()值,

注意相同元素的hashCode()值一定相同,但hashCode()值相同元素不一定相同,

然后看当前存放的元素的哈希值与已经存入HashSet的元素的哈希值是否相同。

如果不同 :就直接添加到集合;

如果相同 :则继续调用元素的equals() 和哈希值相同的这些元素依次去比较。如果说有返回true的,那就重复不添加;如果说比较结果都说false,那就是不重复就添加。

  • 本题要求把姓名相同的人当做同一个人,所以在hashCode()方法中要返回name的hashCode,在比较过程中也是你叫name是否相同

源代码:

public class S6_4 {public static void main(String[] args) {HashSet hs=new HashSet();Person p1=new Person("张三",18);Person p4=new Person("李四",20);Person p2=new Person("王五",19);Person p3=new Person("张三",18);hs.add(p1);hs.add(p2);hs.add(p3);hs.add(p4);System.out.println(hs);}
}
class Person{String name;int age;public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}@Overridepublic int hashCode() {//返回name的hashcodereturn name.hashCode();}@Overridepublic boolean equals(Object obj) {//首先直接判断传入的obj与this当前对象是否相等//相等则直接return trueif(this==obj){return true;}//判断传入的obj是否为Person类,不同则肯定不相等falseif(!(obj instanceof Person)){return false;}//将传入的obj转为Person类,再判断名字是否相等Person p=(Person) obj;return this.name.equals(p.name);}

实验五:

5、编写程序将一组学生对象的姓名和成绩存入到一个树集(TreeSet)中,完成以下要求:

• 使得按照成绩自动降序排列,并输出排序的结果。

思路解析

  • 本题考察TreeSet的排序问题,分为自然排序与定制排序,我这里用的是自然排序,就是在自定义类中实现Comparable接口并重写compareTo方法

源代码:

public class S6_5 {public static void main(String[] args) {Student stu1 = new Student("张三", 88);Student stu2 = new Student("李四", 99);Student stu3 = new Student("王五", 77);TreeSet tset = new TreeSet();tset.add(stu1);tset.add(stu2);tset.add(stu3);System.out.println(tset);}
}class Student implements Comparable {String name;int score;public Student(String name, int score) {this.name = name;this.score = score;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", score=" + score +'}';}@Overridepublic int hashCode() {return super.hashCode();}@Overridepublic boolean equals(Object obj) {return super.equals(obj);}@Overridepublic int compareTo(Student student) {//加负号为降序,不加为升序return -Integer.compare(this.score, student.score);}
}

实验六:

6、编写一个程序,读取个数不定的整数,然后查找其中出现频率最高的数字。要求通过键盘输入数据,当输入为0时,表示结束输入。如: 如果输入的数据是2 3 40 3 54 -3 3 3 2 0,那么数字3的出现频率是最高的。如果出现频率最高的数字不是一个而是多个,则应该将它们全部输出。例如当数据是9 30 3 9 3 2 4时,3和9都出现了两次,3和9都应该输出。

提示:可以利用集合的元素不能重复这一特性。

思路解析:

  • 首先我们会想到Map来存储key==value键值对,key为数组,value为该数字出现的次数
  • 然后我们再找到value的最大值输出相应的key就好了

源代码:

public class S6_6 {public static void main(String[] args){Scanner reader=new Scanner(System.in);//hashMap用来存放数字以及它对应的频率HashMap hashMap=new HashMap();System.out.println("请输入数据");while (true){int num = reader.nextInt();if (num == 0){break;}//如果当前集合中没有该元素,则hashMap.put(num,1);if(!(hashMap.containsKey(num))){hashMap.put(num,1);}else {//如果已经存在该元素,将其value加一int value = hashMap.get(num);value+=1;hashMap.put(num,value);}}int max = 0;int count = 0;//得到频率最高为多少即maxCollection values = hashMap.values();for(int num : values){//先将第一个value赋给maxif(count==0){max = num;count++;}if(num>max){max = num;}}System.out.println("当当当当~频率最高的数字如下:");//得到hashMap对应key的集合Set key = hashMap.keySet();//遍历key的值再比较其对应的value值,如果value=key,输出keyfor(int num : key){if(hashMap.get(num)==max){System.out.println(num);}}}}

实验七:

7、选择合适的Map集合保存5个用户的用户名和密码,然后将这些键值对打印出来。

思路解析:

  • 本题简单的考察了Map集合的遍历输出,了解Map的entrySet()方法这道题迎刃而解

源代码:

public class S6_7 {public static void main(String[] args) {HashMap hashMap = new HashMap();hashMap.put("001","123");hashMap.put("002","234");hashMap.put("003","345");hashMap.put("004","456");hashMap.put("005","567");Set entrySet = hashMap.entrySet();Iterator iterator = entrySet.iterator();while (iterator.hasNext()){System.out.println(iterator.next());}}
} 

实验八:

8、(选做)统计字符串中每个单词出现的次数,使用HashMap来实现。例如:“Today, We have a class of java, as we kown, java is an object oriented programming language, and java is fun! wish you enjoy it!”,统计结果存储成以下形式:

a–>1

an–>1

and–>1

as–>1……

is–>2

提示:使用String.split((“[ \n\t\r.,;:!?()]”)方法进行分词。

思路分析:

  • 同样我们首先想到Map存放单词以及对应出现的次数
  • 根据提示,我们可以用String.split((“[ \n\t\r.,;:!?()]”)方法将字符串分为字符串数组

源代码:

public class S6_8 {public static void main(String[] args) {String str = new String("Today,We have a class of java,as we kown,java is an object oriented programming language,and java is fun!wish you enjoy it!");//首先将一大串句子中的每个单词通过split转化为string数组String split[] = str.split(("[ \n\t\r.,;:!?()]"));//hashmap用来存key==value键值对,其中key为字母,value为该字母出现次数HashMap hashMap = new HashMap();for(int i = 0;iif(!(hashMap.containsKey(split[i]))){hashMap.put(split[i],1);}else {int value = (int)hashMap.get(split[i]);value++;hashMap.put(split[i],value);}}//普普通通的遍历结束Set entrySet = hashMap.entrySet();Iterator iterator = entrySet.iterator();while (iterator.hasNext()){System.out.println(iterator.next());}}
}  

实验九:

9、(选做)500个人围成一个圈,从1开始报数,数到3的倍数的人离开圈子,循环往复,直到最后圈子只剩下一人为止,求剩下的人原来在圈子的位置。

提示:可以使用集合(ArrayList)或队列(Deque)实现。

解题思路:

  • 这道题是非常经典的约瑟夫环问题,大家可以先看看我的代码,如果没搞明白强烈建议百度搜一搜,很多人都把这问题解释的十分明白了,是一道经典的算法题。

源代码:

  • 集合实现
public class S6_9 {public static void main(String[] args) {ArrayList arrayList = new ArrayList();//添加五百个人for(int i = 1;i<=500;i++){arrayList.add(i);}int i = 0;//集合的下标int count = 0;//报数while (arrayList.size()>1){count++;//报数加一if(count==3){arrayList.remove(i);i--;//如果这个人离开了,注意i--count=0;//报数归零}//如果到最后一个人了,i归零继续循环if(i==arrayList.size()-1){i = 0;}else {i++;}}System.out.println("最后一个人为:"+arrayList);}
}
  • 队列实现
public class S6_9 {public static void main(String[] args) {Queue loop = new LinkedList() ;//保存元素用于计算//n个元素入队loopfor(int i=1;i<=500;i++) {loop.offer(i);}int  count = 0;//计数,逢3出队int  num = 0;while (loop.size()>1){//先出队,得到当前出队的元素,//如果count=3,不再入队,否则入队到队尾,实现循环num = loop.poll();count++;if(count==3) {count=0;}else {loop.offer(num);}}//loop最后只剩一个元素System.out.println(loop);}}

🎉文章到这里就结束了,感谢诸佬的阅读。🎉

💕欢迎诸佬对文章加以指正,也望诸佬不吝点赞、评论、收藏加关注呀😘

相关内容

热门资讯

白水杜康的“黄河清香”战略 执笔 | 文 清 编辑 | 骆 言 在黄河的奔流声中,一场关于白酒产业的革命正悄然兴起。 7月5日...
和美“香遇”德国,五粮液与世界... 面对全球化浪潮,中国白酒品牌出海,既是酒企创新开拓的战略选择,也是酒类产区融入世界烈酒产业生态的重要...
一颗大豆的 43 年突围:永和... 从1982 年在宝岛台湾成立公司,到1995 年怀揣着 “中国风、台湾味、两岸情”的初心,永和豆浆跨...
原创 去... #《令人难忘的姐夫家丸子,制作方法大揭秘》 作为一名热爱美食、热衷于探索各种美味的“生活记录者”,...
江西风味糖醋荷包蛋,酸甜适中超... 江西糖醋荷包蛋是一道家常又下饭的菜,酸甜开胃,蛋香浓郁,做法简单,适合忙碌的日常。它的味道有点像糖醋...
当企业定制蛋糕成为传递温度的“... 在竞争激烈的商业世界中,企业形象塑造早已不局限于硬性指标。当95后、00后成为职场主力军,如何通过有...
原创 中... 中国菜,有着几千年的历史和多样化的风味。 即便是在中国之外的地区,它也在努力“开枝散叶”,与当地的...
海洋美学X中秋团圆 | 艾玛琳... 2025年7月5日,艾玛琳在新品发布会上隆重推出了其第十代燕窝月饼——“繁花月满 梦幻海洋”系列。此...
云南凤庆:一年一度“枞”飨盛宴 央广网临沧7月8日消息(记者 魏文青)近日,云南进入食菌季节,鸡枞菌大量上市,村民们翻山越岭踏上寻菌...
原创 小... 在餐饮行业,单品爆红的品牌往往如流星般璀璨却短暂,然而阿芮烤鸡爪却是一个例外。 阿芮烤鸡爪,这个曾凭...
一日为师终身为父,郭德纲为什么... 一日为师终身为父,郭德纲为什么不认杨志刚?第一件事是杨志刚对于郭德纲徒弟身份模棱两可的说法。杨志刚不...
我是女生,22岁参加工作,早吗... 我是女生,22岁参加工作,早吗?不早。。我工作时才18岁。。。不早了。本科出来正好22岁。要是继续考...
老婆紧紧抱白自己是什么意思 老婆紧紧抱白自己是什么意思在恋爱中男女拥抱是件很正常的事,但拥抱太紧的时候意味着什么呢?首先我们先了...
罗念生龙灯内容概括? 罗念生龙灯内容概括?罗念生的龙灯这篇文章当中所有的线索都是看耍龙灯,他们从小的时候看,长大了之后看是...
动漫东东帐号 动漫东东帐号账号:炎发秘密:7891****6
宝马3系刹停和松开异响是怎么回... 宝马3系刹停和松开异响是怎么回事?宝马三系刹车和松开异响是怎么回事儿?我们可以检查一下是否缺刹车油造...
秋季草丛里有什么昆虫在白天叫? 秋季草丛里有什么昆虫在白天叫?秋季草丛里面有什么昆虫在白天叫秋季草丛里面有很多昆虫是白天叫的。这种虫...
偷鸡贼与鸡的故事 偷鸡贼与鸡的故事偷鸡贼与鸡的故事这个是黄鼠狼给鸡拜年,不按好心偷鸡不成蚀把米
求《花火》美文 求《花火》美文......
逝去的诺言,南山南,一生所爱,... 逝去的诺言,南山南,一生所爱,喜欢听这几首歌的人,是种什么心里?想有一段荡气回肠的情感历程虽然我不是...