关于java集合的练习
练习一:Collection集合练习
一、产生10个1-100的随机数,并放到一个数组中,把数组中大于等于10的数字放到一个list集合中,并打印到控制台。
1 public class Topic1 { 2 public static void main(String[] args) { 3 ArrayList<Integer> list = new ArrayList<>(); 4 int arr[] = new int[10]; 5 Random ra = new Random(); 6 for (int i = 0; i < arr.length; i++) { 7 arr[i]=ra.nextInt(100)+1; 8 if (arr[i]>=10) 9 list.add(arr[i]); 10 } 11 System.out.println(list); 12 } 13 }
练习二:Collection集合练习
一、定义一个方法listTest(ArrayList<Integer> al, Integer s),要求返回s在al里面第一次出现的索引,如果s没出现过返回-1。
1 public class Topic2 { 2 public static void main(String[] args) { 3 ArrayList<Integer> arrayList = new ArrayList<>(); 4 arrayList.add(1); 5 arrayList.add(2); 6 arrayList.add(6); 7 arrayList.add(4); 8 arrayList.add(9); 9 10 System.out.println("索引值为:"+listTest(arrayList,4)); 11 } 12 public static int listTest(ArrayList<Integer> al, Integer s){ 13 14 for (int i = 0; i < al.size(); i++) { 15 if (al.get(i)==s) 16 return i; 17 } 18 return -1; 19 } 20 }
练习三:LinkedList使用
已知数组存放一批QQ号码,QQ号码最长为11位,最短为5位String[] strs = {"12345","67891","12347809933","98765432102","67891","12347809933"}。
将该数组里面的所有qq号都存放在LinkedList中,将list中重复元素删除,将list中所有元素分别用迭代器和增强for循环打印出来。
1 import java.util.Iterator; 2 import java.util.LinkedHashSet; 3 import java.util.LinkedList; 4 5 /* 6 * 已知数组存放一批QQ号码,QQ号码最长为11位,最短为5位String[] strs = {"12345","67891","12347809933","98765432102","67891","12347809933"}。 7 将该数组里面的所有qq号都存放在LinkedList中,将list中重复元素删除,将list中所有元素分别用迭代器和增强for循环打印出来。 8 9 * */ 10 public class Topic3 { 11 public static void main(String[] args) { 12 String[] strs = {"12345","67891","12347809933","98765432102","67891","12347809933"}; 13 LinkedHashSet<String> set = method01(strs); 14 //方式1 15 // System.out.println(set); 16 //方式2 17 // System.out.println(method02(strs)); 18 //迭代器打印 19 Iterator<String> it = method01(strs).iterator(); 20 while (it.hasNext()){ 21 String value = it.next(); 22 System.out.print(value+" "); 23 } 24 System.out.println(); 25 //增强for打印 26 for (String s : method02(strs)) { 27 System.out.print(s+" "); 28 } 29 30 } 31 //方式2 32 private static LinkedList<String> method02(String[] strs) { 33 LinkedList<String> list = new LinkedList<>(); 34 for (int i = 0; i < strs.length; i++) { 35 list.add(strs[i]); 36 37 38 } 39 int flag =1;// 0为找不到,1为找到 40 //如果此元素在,除了本次位置的其他元素内找到,则删除该元素. 41 for (int i = 0; i < list.size(); i++) { 42 //判断这个元素之后的元素 是否与这个元素相等. 是则删除,不是则继续执行. 43 for(int j=i+1;j<list.size();j++){ 44 if (list.get(i).equals(list.get(j))){ 45 list.remove(j); 46 } 47 } 48 } 49 50 return list; 51 } 52 //方式1 53 private static LinkedHashSet<String> method01(String[] strs) { 54 LinkedHashSet<String> set = new LinkedHashSet<>(); 55 for (int i = 0; i < strs.length; i++) { 56 set.add(strs[i]); 57 } 58 return set; 59 } 60 }
练习四:HashSet的使用
双色球规则:双色球每注投注号码由6个红色球号码和1个蓝色球号码组成。红色球号码从1—33中选择;蓝色球号码从1—16中选择;请随机生成一注双色球号码。(要求同色号码不重复)
1 import java.util.ArrayList; 2 import java.util.Random; 3 /* 4 * */ 5 public class Topic4 { 6 public static void main(String[] args) { 7 String stringArr[] = new String[7]; 8 //先确定蓝球位置 标记为flag. 9 int flag = 0; 10 Random ra = new Random(); 11 int blueBallIndex = ra.nextInt(7); 12 stringArr[blueBallIndex]=method2(); 13 for (int i = 0; i < stringArr.length; i++) { 14 if(i==blueBallIndex) 15 continue; 16 stringArr[i]=method1(); 17 } 18 //for循环打印 19 for (int i = 0; i < stringArr.length; i++) { 20 System.out.print(stringArr[i]+" "); 21 } 22 } 23 24 //method1 返回红球字符串 25 public static String method1(){ 26 ArrayList<String> arrayList = new ArrayList<>(); 27 for (int i = 0; i < 33; i++) { 28 Integer temp = (i+1); 29 arrayList.add(temp.toString()); 30 } 31 Random ra = new Random(); 32 int randomValue = ra.nextInt(33); 33 return "红球"+arrayList.get(randomValue); 34 } 35 //method2 返回蓝球字符串 36 public static String method2(){ 37 ArrayList<String> arrayList = new ArrayList<>(); 38 for (int i = 0; i < 16; i++) { 39 Integer temp = (i+1); 40 arrayList.add(temp.toString()); 41 } 42 Random ra = new Random(); 43 int randomValue = ra.nextInt(16); 44 return "蓝球"+arrayList.get(randomValue); 45 } 46 47 48 }
练习五:Comparable和Comparator的使用
分别用Comparable和Comparator两个接口对下列四位同学的成绩做降序排序,如果成绩一样,那在成绩排序的基础上按照年龄由小到大排序。
姓名(String) | 年龄(int) | 分数(float) |
liusan | 20 | 90.0F |
lisi | 22 | 90.0F |
wangwu | 20 | 99.0F |
sunliu | 22 | 100.0F |
编写一个Student类用来实现Comparable<Student>接口,并在其中重写CompareTo(Student o)方法
1 package topic5; 2 3 public class Student implements Comparable<Student> { 4 private String name; 5 private int age; 6 private float sorce; 7 8 public Student() { 9 } 10 11 public Student(String name, int age, float sorce) { 12 this.name = name; 13 this.age = age; 14 this.sorce = sorce; 15 } 16 17 public String getName() { 18 return name; 19 } 20 21 public void setName(String name) { 22 this.name = name; 23 } 24 25 public int getAge() { 26 return age; 27 } 28 29 public void setAge(int age) { 30 this.age = age; 31 } 32 33 public float getSorce() { 34 return sorce; 35 } 36 37 @Override 38 public String toString() { 39 return "Student{" + 40 "name='" + name + '\'' + 41 ", age=" + age + 42 ", sorce=" + sorce + 43 '}'; 44 } 45 46 public void setSorce(float sorce) { 47 this.sorce = sorce; 48 } 49 /* 50 * 51 * */ 52 @Override 53 public int compareTo(Student o) { 54 //定义一个中间变量判断成绩的大小 如果成绩相等 比较年龄 55 int result = (int)(o.getSorce() - this.getSorce()); 56 if(result==0){ 57 result = o.getAge()-this.getAge(); 58 } 59 return result; 60 // return (int)(o.getSorce() - this.getSorce()); 61 } 62 }
在主函数中使用Comparable 与 Comparetor分别对ArrayList进行排序.
1 import java.util.ArrayList; 2 import java.util.Collections; 3 import java.util.Comparator; 4 5 /* 6 * 分别用Comparable和Comparator两个接口对下列四位同学的成绩做降序排序,如果成绩一样,那在成绩排序的基础上按照年龄由小到大排序。 7 姓名(String) 年龄(int) 分数(float) 8 liusan 20 90.0F 9 lisi 22 90.0F 10 wangwu 20 99.0F 11 sunliu 22 100.0F 12 13 * */ 14 public class Topic5 { 15 public static void main(String[] args) { 16 Student stu1 = new Student("liusan",20,90.0f); 17 Student stu2 = new Student("lisi",22,90.0f); 18 Student stu3 = new Student("wangwu",20,90.0f); 19 Student stu4 = new Student("sunliu",20,100.0f); 20 System.out.println("升序排序"); 21 ArrayList<Student > arr = new ArrayList<>(); 22 arr.add(stu1); 23 arr.add(stu2); 24 arr.add(stu3); 25 arr.add(stu4); 26 Collections.sort(arr); 27 System.out.println(arr); 28 //打乱重新写方法排序 29 Collections.shuffle(arr); 30 //写一个Compelator方法 31 Collections.sort(arr, new Comparator<Student>() { 32 @Override 33 public int compare(Student o1, Student o2) { 34 int result = (int)(o2.getSorce() - o1.getSorce()); 35 if(result==0){ 36 result = o2.getAge()-o1.getAge(); 37 } 38 return result; 39 40 } 41 }); 42 System.out.println("升序排序"); 43 System.out.println(arr); 44 45 } 46 }
练习六:Map集合的使用(一)
一、现在有一个map集合如下:
Map<Integer,String> map = new HashMap<Integer, String>();
map.put(1, "张三丰");
map.put(2, "周芷若");
map.put(3, "汪峰");
map.put(4, "灭绝师太");
要求:
1.遍历集合,并将序号与对应人名打印。
2.向该map集合中插入一个编码为5姓名为李晓红的信息
3.移除该map中的编号为1的信息
4.将map集合中编号为2的姓名信息修改为"周林"
1 import java.util.HashMap; 2 import java.util.Map; 3 import java.util.Set; 4 5 /* 6 * 一、现在有一个map集合如下: 7 Map<Integer,String> map = new HashMap<Integer, String>(); 8 map.put(1, "张三丰"); 9 map.put(2, "周芷若"); 10 map.put(3, "汪峰"); 11 map.put(4, "灭绝师太"); 12 13 *要求: 14 1.遍历集合,并将序号与对应人名打印。 15 2.向该map集合中插入一个编码为5姓名为李晓红的信息 16 3.移除该map中的编号为1的信息 17 4.将map集合中编号为2的姓名信息修改为"周林" 18 19 * 20 * */ 21 public class Topic6 { 22 public static void main(String[] args) { 23 Map<Integer,String> map = new HashMap<Integer, String>(); 24 map.put(1, "张三丰"); 25 map.put(2, "周芷若"); 26 map.put(3, "汪峰"); 27 map.put(4, "灭绝师太"); 28 //1.遍历集合,并将序号与对应人名打印。 29 for(Map.Entry<Integer,String> entry:map.entrySet()){ 30 System.out.println(entry.getKey()+ " "+ entry.getValue()); 31 } 32 System.out.println("================"); 33 //3.移除该map中的编号为1的信息 34 map.remove(1); 35 for(Map.Entry<Integer,String> entry:map.entrySet()){ 36 System.out.println(entry.getKey()+ " "+ entry.getValue()); 37 } 38 System.out.println("================"); 39 //4.将map集合中编号为2的姓名信息修改为"周林" 40 map.put(2,"周林"); 41 for(Map.Entry<Integer,String> entry:map.entrySet()){ 42 System.out.println(entry.getKey()+ " "+ entry.getValue()); 43 } 44 } 45 }
练习七:Map集合的使用(二)
一、有2个数组,第一个数组内容为:[黑龙江省,浙江省,江西省,广东省,福建省],第二个数组为:[哈尔滨,杭州,南昌,广州,福州],将第一个数组元素作为key,第二个数组元素作为value存储到Map集合中。如{黑龙江省=哈尔滨, 浙江省=杭州, …}。
1 import java.util.HashMap; 2 import java.util.Map; 3 4 /* 5 * 二、有2个数组,第一个数组内容为:[黑龙江省,浙江省,江西省,广东省,福建省],第二个数组为:[哈尔滨,杭州,南昌,广州,福州],将第一个数组元素作为key, 6 * 第二个数组元素作为value存储到Map集合中。如{黑龙江省=哈尔滨, 浙江省=杭州, …}。 7 * */ 8 public class Topic7 { 9 public static void main(String[] args) { 10 String str1[] = {"黑龙江省","浙江省","江西省","广东省","福建省"}; 11 String str2[] = {"哈尔滨","杭州","南昌","广州","福州"}; 12 HashMap<String,String> map = new HashMap<>(); 13 for (int i = 0; i < str1.length; i++) { 14 for (int j = 0; j < str2.length; j++) { 15 map.put(str1[i],str2[j]); 16 } 17 } 18 System.out.print("{"); 19 for (Map.Entry<String,String> entry: map.entrySet()){ 20 System.out.printf("%s=%s,",entry.getKey(),entry.getValue()); 21 } 22 System.out.println("}"); 23 } 24 }
练习八:Map集合的使用(三)
一、定义一个泛型为String类型的List集合,统计该集合中每个字符(注意,不是字符串)出现的次数。例如:集合中有”abc”、”bcd”两个元素,程序最终输出结果为:“a = 1,b = 2,c = 2,d = 1”。
1 import java.util.*; 2 3 /* 4 * 三、定义一个泛型为String类型的List集合,统计该集合中每个字符(注意,不是字符串)出现的次数。 5 * 例如:集合中有”abc”、”bcd”两个元素, 6 * 程序最终输出结果为:“a = 1,b = 2,c = 2,d = 1”。 7 * */ 8 public class Topic8 { 9 public static void main(String[] args) { 10 //定义一个String类型的List集合,用来存储题目给定的字符串 11 LinkedList<String> list = new LinkedList<>(); 12 list.add("abc"); 13 list.add("bcd"); 14 //将集合中的两个元素进行拼接,调用method1(String str) 进行统计,筛选. 15 String str = list.get(0)+list.get(1); 16 method1(str); 17 } 18 private static void method1(String str) { 19 20 //1. 创建Map集合,key是字符串中的字符,value是字符的个数 21 //由于HashMap具有筛选功能,可以帮助我们对字符进行统计. 22 HashMap<Character,Integer> map = new HashMap<>(); 23 //2.将形式参数传递过来的字符串使用toCharArray()的方法转换成Char类型的字符数组.c用来遍历获取字符数组中的每一个值. 24 for(char c :str.toCharArray()){ 25 //对于字符串"abcbcd"为例,char c =a; map.containKey(a)为false,执行:号后的1 26 //map.put(a,1); 这样就将a字符与对应的数量添加到了map集合中. 27 map.put(c,map.containsKey(c)?map.get(c)+1:1); 28 } 29 //获取最后一个key 30 Set<Character> chrs = map.keySet(); 31 List list = new ArrayList(chrs); 32 char lastKey = (char)(list.get(list.size()-1)); 33 //char lastKey = (char)list.lastIndexOf("d"); 34 // System.out.println(lastKey); 35 for(Map.Entry<Character,Integer> entry : map.entrySet()){ 36 char key = entry.getKey(); 37 int value = entry.getValue(); 38 //如果是最后一个key直接打印key与value结束. 39 if (key == lastKey) 40 { 41 System.out.println(key+"="+value); 42 break; 43 } 44 //如果不是最后一个,打印 key与value和一个逗号分隔 45 System.out.print(key+"="+value+","); 46 47 } 48 49 } 50 }
练习九:Map集合的使用(四)
一、利用Map,完成下面的功能:
从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队。如果该 年没有举办世界杯,则输出:没有举办世界杯。
//tips:参阅Map接口containsKey(Object key)方法
二、在原有世界杯Map 的基础上,增加如下功能: 读入一支球队的名字,输出该球队夺冠的年份列表。 例如,读入“巴西”,应当输出 1958 1962 1970 1994 2002 读入“荷兰”,应当输出 没有获得过世界杯
//tips:参阅Map接口containsValue(Object value)方法
示例:
附:历届世界杯冠军
届数 | 举办年份 | 举办地点 | 冠军 |
1930年 | 乌拉圭 | 乌拉圭 | |
第二届 | 1934年 | 意大利 | 意大利 |
第三届 | 1938年 | 法国 | 意大利 |
第四届 | 1950年 | 巴西 | 乌拉圭 |
第五届 | 1954年 | 瑞士 | 西德 |
第六届 | 1958年 | 瑞典 | 巴西 |
第七届 | 1962年 | 智利 | 巴西 |
第八届 | 1966年 | 英格兰 | 英格兰 |
第九届 | 1970年 | 墨西哥 | 巴西 |
第十届 | 1974年 | 前西德 | 西德 |
第十一届 | 1978年 | 阿根廷 | 阿根廷 |
第十二届 | 1982年 | 西班牙 | 意大利 |
第十三届 | 1986年 | 墨西哥 | 阿根廷 |
第十四届 | 1990年 | 意大利 | 西德 |
第十五届 | 1994年 | 美国 | 巴西 |
第十六届 | 1998年 | 法国 | 法国 |
第十七届 | 2002年 | 韩日 | 巴西 |
第十八届 | 2006年 | 德国 | 意大利 |
第十九届 | 2010年 | 南非 | 西班牙 |
第二十届 | 2014年 | 巴西 | 德国 |
1 import java.util.HashMap; 2 import java.util.Map; 3 import java.util.Scanner; 4 5 public class Topic9 { 6 public static void main(String[] args) { 7 HashMap<Integer,String> map = new HashMap<>(); 8 map.put(1930,"乌拉圭"); 9 map.put(1934,"意大利"); 10 map.put(1938,"意大利"); 11 map.put(1950,"乌拉圭"); 12 map.put(1954,"西德"); 13 map.put(1958,"巴西"); 14 map.put(1962,"巴西"); 15 map.put(1966,"英格兰"); 16 map.put(1970,"巴西"); 17 map.put(1974,"西德"); 18 map.put(1978,"阿根廷"); 19 map.put(1982,"意大利"); 20 map.put(1986,"阿根廷"); 21 map.put(1990,"西德"); 22 map.put(1994,"巴西"); 23 map.put(1998,"法国"); 24 map.put(2002,"巴西"); 25 map.put(2006,"意大利"); 26 map.put(2010,"西班牙"); 27 map.put(2014,"德国"); 28 System.out.println("请输入年份:"); 29 Scanner sc = new Scanner(System.in); 30 int inputNum = sc.nextInt(); 31 for (Map.Entry<Integer,String> entry: map.entrySet()){ 32 int key = entry.getKey(); 33 String value = entry.getValue(); 34 if (inputNum==key) 35 System.out.println(key+"年获得世界杯冠军的是:"+value); 36 } 37 String temp = sc.nextLine(); 38 System.out.println("请输入国家名称"); 39 String inputStr = sc.nextLine(); 40 int flag = 0;//标记没有夺冠 41 for (Map.Entry<Integer,String> entry: map.entrySet()){ 42 if(entry.getValue().equals(inputStr)){ 43 System.out.println(entry.getKey()+"."); 44 flag=1; 45 } 46 } 47 if(flag==0){ 48 System.out.println("没有获得过世界杯"); 49 } 50 51 } 52 }
练习十:综合练习
1.站编号和站名对应关系如下:
1=朱辛庄
2=育知路
3=平西府
4=回龙观东大街
5=霍营
//....
将以上对应关系的数据存储到map集合中,key:表示站编号,value:表示站名,并遍历打印(可以不按顺序打印):
第10站: 森林公园南门
第6站: 育新
第12站: 奥体中心
第13站: 北土城
//...
2.计算地铁票价规则:
总行程 3站内(包含3站)收费3元,
3站以上但不超过5站(包含5站)的收费4元,
5站以上的,在4元的基础上,每多1站增加2元,
10元封顶;
3.打印格式(需要对键盘录入的上车站和到达站进行判断,如果没有该站,提示重新输入,直到站名存在为止):
注意:每站需要2分钟
请输入上车站:
沙河
您输入的上车站:沙河不存在,请重新输入上车站:
上地
您输入的上车站:上地不存在,请重新输入上车站:
朱辛庄
请输入到达站:
沙河
您输入的到达站:沙河不存在,请重新输入到达站:
西二旗
您输入的到达站:西二旗不存在,请重新输入到达站:
西小口
从朱辛庄到西小口共经过6站收费6元,大约需要 12分钟
1 import java.util.LinkedHashMap; 2 import java.util.Map; 3 import java.util.Scanner; 4 5 public class Topic10 { 6 public static void main(String[] args) { 7 /*创建一个LinkedHashMap用来存储地铁站编号 以及 地铁站名称*/ 8 LinkedHashMap<Integer, String> map = new LinkedHashMap<>(); 9 map.put(1, "朱辛庄"); 10 map.put(2, "育知路"); 11 map.put(3, "平西府"); 12 map.put(4, "回龙观东大街"); 13 map.put(5, "霍营"); 14 map.put(6, "育新"); 15 map.put(7, "西小口"); 16 map.put(8, "永泰庄"); 17 map.put(9, "林萃桥"); 18 map.put(10, "森林公园南门"); 19 map.put(11, "奥林匹克公园"); 20 map.put(12, "奥体中心"); 21 map.put(13, "北土城"); 22 23 //声明上车时的地铁站 和 下车时的地铁站 24 String upStation; 25 String downStation; 26 27 Scanner sc = new Scanner(System.in); 28 //声明上车时的key,下车时的key 29 int beforeKey = 0, afterKey = 0; 30 //无限循环判断用户输入 31 // 1.如果输入不合法继续请求用户输入 32 // 2.如果输入合法就记录 上车的地铁站名称 以及 上错车的地铁站编号 33 // break跳出无限循环. 34 for (; ; ) { 35 System.out.println("请输入上车的车站:"); 36 upStation = sc.nextLine(); 37 if (map.containsValue(upStation)) { 38 System.out.println("请上车!"); 39 for (Map.Entry<Integer, String> entry : map.entrySet()) { 40 if (entry.getValue().equals(upStation)) { 41 //记录本次车站的key值 42 beforeKey = entry.getKey(); 43 44 } 45 } 46 // System.out.println(beforeKey); 47 break; 48 } 49 else { 50 System.out.println(upStation + "不存在,请重新输入上车站:"); 51 } 52 53 } 54 //============================================== 55 //当上车的地铁站输入正确,并正确记录后 56 //请求用户输入 57 for (; ; ) { 58 System.out.println("请输入下车的车站:"); 59 downStation = sc.nextLine(); 60 if (map.containsValue(downStation)) { 61 System.out.println("请上车!"); 62 for (Map.Entry<Integer, String> entry : map.entrySet()) { 63 if (entry.getValue().equals(downStation)) { 64 //记录本次车站的key值 65 afterKey = entry.getKey(); 66 67 } 68 } 69 // System.out.println(beforeKey); 70 break; 71 } 72 else { 73 System.out.println(downStation + "不存在,请重新输入下车站:"); 74 } 75 76 } 77 /* 78 * 总行程 3站内(包含3站)收费3元, 79 3站以上但不超过5站(包含5站)的收费4元, 80 5站以上的,在4元的基础上,每多1站增加2元, 81 10元封顶; 82 83 * */ 84 int value = afterKey - beforeKey; 85 int prize=0; 86 int time=0; 87 if (value<=3) 88 { 89 prize=3; 90 91 } 92 else if(value>3 &&value<=5) 93 { 94 prize=4; 95 96 } 97 else if (value>5 && value<=9) 98 { 99 prize=(value-5)*2+4; 100 //如果prize计算的价格超过了10R,则将10赋值给prize 101 if (prize>=10) 102 prize=10; 103 } 104 else 105 prize=10; 106 System.out.printf("从%s到%s经过%d站收费%d元,大约需要%d分钟\n",upStation,downStation,value,prize,value*2); 107 108 } 109 }