Java 学习(21)--集合笔试题

简介: 集合笔试题1.产生10个1-20之间的随机数,要求随机数不能重复(List 和 Set 分别实现)分析:1.创建一个 ArrayList 对象           2.如果 ArrayList 对象长度小于 10           3.在循环中,创建一个 Random 对象,产生 1-20 之间的随机数           4. 通过 ArrayList 对象 d constains 方法判断,该随机数是否存在于集合中,不存在则加入,存在则放弃。

集合笔试题

1.产生10个1-20之间的随机数,要求随机数不能重复(List 和 Set 分别实现)

分析:1.创建一个 ArrayList 对象

           2.如果 ArrayList 对象长度小于 10

           3.在循环中,创建一个 Random 对象,产生 1-20 之间的随机数

           4. 通过 ArrayList 对象 d constains 方法判断,该随机数是否存在于集合中,不存在则加入,存在则放弃。

代码:

1.List

package com.neuedu.collection;

import java.util.ArrayList;
import java.util.Random;

public class Demo1 {
	public static void main(String[] args) {
		ArrayList<Integer> list = new ArrayList<>();
		while(list.size() < 10){
			Random random = new Random();
			int nextInt = random.nextInt(20) + 1;
			if(!list.contains(nextInt)) {
				list.add(nextInt);
			}
		}
			
		System.out.println(list);
	}

}

输出:

2.Set (无序【添加顺序和打印顺序不一致】、不重复)

package com.neuedu.collection;

import java.util.HashSet;
import java.util.Set;


public class Demo2 {
	public static void main(String[] args) {
		Set set = new HashSet<Integer>();
		while(set.size() < 10) {
			int random = (int)(Math.random() * 20) + 1;
			set.add(random);
		}
		
		System.out.println(set);
	}

}

输出:

拓展:当两个内容相同则输出一个,不同则都输出

hashcode: 根据一个对象,通过一定的算法,计算出一个 32位 的 2进制 表示的数据(不定长数据  转换  定长数据)

Object hashcode(默认的hashcode):根据对象在内存的地址来计算 hashcode 值(基本都不相同)

name 是string 类型 ,string 类型重写 hashcode ,当字符串内容相同则 hashcode 值相同(属性相关)

set 结构:

竖:hashtable(hash 桶)里面的小格(hashcode),当hashcode 值相同时才会放到同一个小格里面;

横:LinkedList(链表),里面的小格(equal 后的值),若二者相同则表示在链表的同一格里面,重复的不在添加到小格中;如二者不同则不在同一格里面,将不同的放在后面的小格里面。

package com.neuedu.collection;

import java.util.HashSet;
import java.util.Set;


public class SetDemo {
	public static void main(String[] args) {
		Set<Person> set = new HashSet<Person>();
	
		Person p1 = new Person("林青霞", 50);
		Person p2 = new Person("林青霞", 40);
		set.add(p1);
		set.add(p2);
		
		System.out.println(set);
				
		
	}

}
class Person {
	private String name;
	private int age;
	
	
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	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;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
	
	@Override
	public int hashCode() {
		return name.hashCode() + age;
	} 
	@Override
	public boolean equals(Object obj) {
		if(!(obj instanceof Person)){
			return false;
		}
		Person person = (Person)obj;
		if(this.name.equals(person.name) && this.age == person.age) {
			return true;
		}
		return false;
	}
	
	
}

输出:

2.键盘录入5个学生信息(姓名、语文成绩、数学成绩、英语成绩)按照总分从高到低的顺序(若总分相同,则按照语文、数学、英语的成绩进行倒序)

二叉树:24 18 30 16 20 28 35

中序遍历(详解) :左 中 右     16 18 20 24  28 30 35 

package com.neuedu.collection;

import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;


public class Demo3 {

	public static void main(String[] args) {
		TreeSet<Student> treeSet = new TreeSet<>();
		Scanner scanner = new Scanner(System.in);
		for(int i = 1; i <= 5; i++) {
			System.out.println("请输入第" + i + "个学生的信息");
			System.out.println("姓名:");
			String name = scanner.next();
			System.out.println("语文 成绩:");
			int chinese = scanner.nextInt();
			System.out.println("数学成绩:");
			int math = scanner.nextInt();
			System.out.println("英语成绩:");
			int english = scanner.nextInt();
			
			Student student = new Student(name, chinese, math, english);
			treeSet.add(student);
			
		}
		System.out.println("学生成绩录入完毕");
		System.out.println("按照分数排序后的结果是:");
		System.out.println(treeSet);
		
		

	}

}

class Student implements Comparable<Student>{
	private String name;
	private int chinese;
	private int math;
	private int english;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getChinese() {
		return chinese;
	}
	public void setChinese(int chinese) {
		this.chinese = chinese;
	}
	public int getMath() {
		return math;
	}
	public void setMath(int math) {
		this.math = math;
	}
	public int getEnglish() {
		return english;
	}
	public void setEnglish(int english) {
		this.english = english;
	}
	
	public int getTotal() {
		return chinese + english + math;
	}
	@Override
	public String toString() {
		return "Student [name=" + name + ", chinese=" + chinese + ", math=" + math + ", english=" + english + "]";
	}
	public Student(String name, int chinese, int math, int english) {
		super();
		this.name = name;
		this.chinese = chinese;
		this.math = math;
		this.english = english;
	}
	@Override
	public int compareTo(Student o) {
		int temp = o.getTotal() - this.getTotal();
		if(temp == 0) {
			temp = o.chinese - this.chinese;
		}
		if(temp == 0) {
			temp = o.math - this.math;
		}
		if(temp == 0) {
			temp = o.english - this.english;
		}
		
		/*temp = (temp != 0 ? temp : (o.chinese - this.chinese));
		temp = (temp != 0  ? temp : (o.math - this.math));
		temp = (temp != 0 ? temp : (o.english - this.english));*/
	
		return  temp;
	}
	
}

输出:(只有2名学生)

3.“aababcabcdabcde”获取字符串中每个字母出现的次数,要求结果 a(5) b(4) c(3)

分析:1.将字符串转换成一个字符数组

           2.对字符数组进行遍历,放到 Set 集合中

package com.neuedu.collection;

import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;

import org.omg.CosNaming.NamingContextExtPackage.StringNameHelper;


public class Demo4 {
	
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入字符串");
		String str = scanner.next();
		TreeSet<Character> treeSet = new TreeSet<>();
		for(int i = 0; i < str.length(); i++) {
			treeSet.add(str.charAt(i));
		}
		System.out.println(treeSet);
		for(Character c : treeSet) {
			
			int count = 0;
			
			for(int i = 0; i < str.length(); i++) {
				if(str.charAt(i) == c) {
					count++;
				}
			}
			
			System.out.print(c+"(" + count + ")   " );
			
		}

	}

}

	

输出:

方法二:

package com.neuedu.collection;

import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;

import org.omg.CosNaming.NamingContextExtPackage.StringNameHelper;

public class Demo4 {
	
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入字符串");
		String str = scanner.next();
		TreeMap<Character, Integer> map = new TreeMap<>();
		//遍历字符串
		for(int i = 0; i < str.length(); i++) {
			//获取每个字符
			Character key = str.charAt(i);	
			//判断map中是否包含该字符,如果不包含,value=1,
			if(!map.containsKey(key)) {
				map.put(key, 1);
			}else {//如果map中已经包含改字符,则取出原来的值+1
				map.put(key, map.get(key) + 1);
			}			
		}
		
		StringBuffer sb = new StringBuffer();
		Set<Entry<Character, Integer>> entrySet = map.entrySet();
		for(Entry<Character, Integer> entry : entrySet) {
			sb.append(entry.getKey()).append("(").append(entry.getValue()).append(")   ");
		}
		System.out.println(sb.toString());
		

}
	

	

输出:

标准方法:

//“aababcabcdabcde”获取字符串中每个字母出现的次数,要求结果 a(5) b(4) c
package com.hd.file;
import java.util.Set;
import java.util.TreeMap;
public class demo3 {
	public static void main(String[] args) {
   	 String str = "aababcabcdabcde";
		TreeMap<Character,Integer> map = new TreeMap<Character,Integer>();
		char[] chs = str.toCharArray();
		for(Character ch:chs){
			Integer value = map.get(ch);
			if(value==null){
				map.put(ch, 1);
			}else{
				value++;
				map.put(ch, value);
			}
		}
		
		Set<Character> set = map.keySet();
		StringBuilder sb =  new StringBuilder();
		for(Character s:set){
			Integer value = map.get(s);
			sb.append(s).append("(").append(value).append(")");
		}
		
		System.out.println(sb.toString());
	}
}

输出:

4.模拟斗地主洗牌、发牌、看牌

方法一:

分析:

分析:
 *    1:创建一副牌
 *         1.1 : 创建一个牌盒
 *         1.2: 装牌
 *    2:洗牌
 *    3:发牌
 *    4:看牌

package com.neuedu.collection;

import java.util.ArrayList;
import java.util.Collections;


public class PokerDemo {
	public static void main(String[] args) {
		ArrayList<String> poker = new ArrayList<>();
		String[] colors = {"","","",""};
		String[] numbers = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
		for(String color : colors) {
			for(String number : numbers) {
				poker.add(color.concat(number));
			}
		}
		poker.add("大王");
		poker.add("小王");
		//洗牌
		Collections.shuffle(poker);
		
		//创建打牌的人
		ArrayList<String> rulai = new ArrayList<>();
		ArrayList<String> sunwukong = new ArrayList<>();
		ArrayList<String> weiwei = new ArrayList<>();
		ArrayList<String> dipai = new ArrayList<>();
		//摸牌
		for(int i = 0; i < poker.size(); i++) {
			if(i >= poker.size() - 3) {
				dipai.add(poker.get(i));
			}
			
			if(i % 3 == 0) {
				rulai.add(poker.get(i));
			}
			if(i % 3 == 1) {
				sunwukong.add(poker.get(i));
			}
			if(i % 3 == 2) {
				weiwei.add(poker.get(i));
			}
			
		}
		
		//看牌
		lookPoker("A", rulai);
		lookPoker("B", sunwukong);
		lookPoker("C", weiwei);
		lookPoker("底牌", dipai);
		
	}
	
	public static void lookPoker(String name, ArrayList<String> pai) {
		System.out.println(name + "的牌是:");
		for(String s : pai) {
			System.out.print(s + " ");
		}
		System.out.println();
		
	}
	

}

输出:

方法二:

思路:
 *     1:创建一个HashMap集合
 * 2:创建一个ArrayList,用来存放牌的编号
 * 3:创建花色数组和点数数组
 * 4:从1编号开始向Hashmap中存放相应的编号和对应的牌,同时往ArrayList中存储编号
 * 5:洗牌(洗的是编号)
 * 6:发牌(发牌发的也是编号,为了保证编号是排序的,应该创建一个TreeSet集合)
 * 7:看牌(遍历TreeSet,获取编号,然后从HashMap中找到对应的牌)

package com.neuedu.collection;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;

/**
 * 4: 模拟斗地主洗牌、发牌和看牌
 * 思路:
 * 	1:创建一个HashMap集合
 * 2:创建一个ArrayList,用来存放牌的编号
 * 3:创建花色数组和点数数组
 * 4:从1编号开始向Hashmap中存放相应的编号和对应的牌,同时往ArrayList中存储编号
 * 5:洗牌(洗的是编号)
 * 6:发牌(发牌发的也是编号,为了保证编号是排序的,应该创建一个TreeSet集合)
 * 7:看牌(遍历TreeSet,获取编号,然后从HashMap中找到对应的牌)
 *
 */
public class PokerDemo2 {
	public static void main(String[] args) {
		Map<Integer,String> poker = new HashMap<>();
		List<Integer> num = new ArrayList<>();
		String[] colors = {"","","",""};
		String[] numbers = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
		int count = 1;
		for(String number : numbers) {
			for(String c : colors) {
				poker.put(count, c.concat(number));
				num.add(count);
				count++;				
			}
		}
		poker.put(count, "小王");
		num.add(count);
		count++;
		poker.put(count, "大王");
		num.add(count);
		//洗牌
		Collections.shuffle(num);
		TreeSet<Integer> linQingXia = new TreeSet<>();
		TreeSet<Integer> zhouRunFa = new TreeSet<>();
		TreeSet<Integer> liuDeHua = new TreeSet<>();
		TreeSet<Integer> diPai = new TreeSet<>();
		
		for(int i = 0; i <num.size(); i++) {
			if(i >= num.size() - 3) {
				diPai.add(num.get(i));
				continue;
			}
			
			if(i % 3 == 0) {
				linQingXia.add(num.get(i));
			}
			if(i % 3 == 1) {
				zhouRunFa.add(num.get(i));
			}
			if(i % 3 == 2) {
				liuDeHua.add(num.get(i));
			}			
		}
		
		//看牌
		lookPoker("A", linQingXia, poker);
		lookPoker("B", zhouRunFa, poker); 
		lookPoker("C", liuDeHua, poker);
		lookPoker("底牌", diPai, poker);
		
	}
	
	public static void lookPoker(String name,Set<Integer> set,Map<Integer, String> map) {
		System.out.println(name + "的牌是:");
		for(Integer key : set) {
			System.out.print(map.get(key) + "  ");
		}
		
		System.out.println();
	}

}

输出:

 

目录
相关文章
|
21天前
|
Java API Maven
2025 Java 零基础到实战最新技术实操全攻略与学习指南
本教程涵盖Java从零基础到实战的全流程,基于2025年最新技术栈,包括JDK 21、IntelliJ IDEA 2025.1、Spring Boot 3.x、Maven 4及Docker容器化部署,帮助开发者快速掌握现代Java开发技能。
221 1
|
28天前
|
数据采集 搜索推荐 Java
Java 大视界 -- Java 大数据在智能教育虚拟学习环境构建与用户体验优化中的应用(221)
本文探讨 Java 大数据在智能教育虚拟学习环境中的应用,涵盖多源数据采集、个性化推荐、实时互动优化等核心技术,结合实际案例分析其在提升学习体验与教学质量中的成效,并展望未来发展方向与技术挑战。
|
2月前
|
并行计算 Java API
Java 基础篇完整学习攻略
本教程涵盖Java基础到高级内容,包括模块化系统、Stream API、多线程编程、JVM机制、集合框架及新特性如Records和模式匹配等,适合零基础学员系统学习Java编程。
68 0
|
2月前
|
Oracle Java 关系型数据库
掌握Java Stream API:高效集合处理的利器
掌握Java Stream API:高效集合处理的利器
329 80
|
2月前
|
安全 Java API
Java 8 Stream API:高效集合处理的利器
Java 8 Stream API:高效集合处理的利器
219 83
|
2月前
|
并行计算 Java API
Java List 集合结合 Java 17 新特性与现代开发实践的深度解析及实战指南 Java List 集合
本文深入解析Java 17中List集合的现代用法,结合函数式编程、Stream API、密封类、模式匹配等新特性,通过实操案例讲解数据处理、并行计算、响应式编程等场景下的高级应用,帮助开发者提升集合操作效率与代码质量。
119 1
|
2月前
|
前端开发 Java API
新手 Java 学习资料结合最新技术的精选推荐及高效学习资源参考
本文为新手推荐了涵盖Java基础到最新技术的学习资料,包括官方文档、在线课程、书籍、学习网站及实践平台,帮助系统掌握Java编程,并通过Spring Boot实战提升开发能力。
107 1
|
2月前
|
NoSQL Java 数据库
Java 全栈学习超全面知识图谱构建完整 Java 知识体系
本文全面讲解Java核心技术体系,涵盖基础语法、面向对象、集合框架、主流框架(Spring、Spring Boot、MyBatis)及三大实战项目(微服务电商、响应式博客、企业后台系统),助你系统掌握Java全栈开发技能。
163 1
|
2月前
|
存储 算法 安全
JAVA 八股文全网最详尽整理包含各类核心考点助你高效学习 jAVA 八股文赶紧收藏
本文整理了Java核心技术内容,涵盖Java基础、多线程、JVM、集合框架等八股文知识点,包含面向对象特性、线程创建与通信、运行时数据区、垃圾回收算法及常用集合类对比,附有代码示例与学习资料下载链接,适合Java开发者系统学习与面试准备。
654 0
|
1月前
|
存储 搜索推荐 安全
Java 大视界 --Java 大数据在智能教育学习效果评估与教学质量改进中的应用(209)
本文探讨了 Java 大数据在智能教育中的创新应用,涵盖学习效果评估、教学质量改进及个性化教学方案定制等内容,结合实战案例与代码解析,展现技术如何赋能教育智能化转型。

热门文章

最新文章