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();
	}

}

输出:

 

目录
相关文章
|
5天前
|
存储 安全 Java
Java 集合框架中的老炮与新秀:HashTable 和 HashMap 谁更胜一筹?
嗨,大家好,我是技术伙伴小米。今天通过讲故事的方式,详细介绍 Java 中 HashMap 和 HashTable 的区别。从版本、线程安全、null 值支持、性能及迭代器行为等方面对比,帮助你轻松应对面试中的经典问题。HashMap 更高效灵活,适合单线程或需手动处理线程安全的场景;HashTable 较古老,线程安全但性能不佳。现代项目推荐使用 ConcurrentHashMap。关注我的公众号“软件求生”,获取更多技术干货!
27 3
|
3月前
|
存储 Java
深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。
【10月更文挑战第16天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。HashSet基于哈希表实现,添加元素时根据哈希值分布,遍历时顺序不可预测;而TreeSet利用红黑树结构,按自然顺序或自定义顺序存储元素,确保遍历时有序输出。文章还提供了示例代码,帮助读者更好地理解这两种集合类型的使用场景和内部机制。
50 3
|
3月前
|
存储 Java 数据处理
Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位
【10月更文挑战第16天】Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位。本文通过快速去重和高效查找两个案例,展示了Set如何简化数据处理流程,提升代码效率。使用HashSet可轻松实现数据去重,而contains方法则提供了快速查找的功能,彰显了Set在处理大量数据时的优势。
40 2
|
3月前
|
XML Java 编译器
Java学习十六—掌握注解:让编程更简单
Java 注解(Annotation)是一种特殊的语法结构,可以在代码中嵌入元数据。它们不直接影响代码的运行,但可以通过工具和框架提供额外的信息,帮助在编译、部署或运行时进行处理。
105 43
Java学习十六—掌握注解:让编程更简单
|
22天前
|
存储 缓存 安全
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
39 5
|
2月前
|
存储 缓存 安全
Java 集合框架优化:从基础到高级应用
《Java集合框架优化:从基础到高级应用》深入解析Java集合框架的核心原理与优化技巧,涵盖列表、集合、映射等常用数据结构,结合实际案例,指导开发者高效使用和优化Java集合。
44 4
|
2月前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
37 2
|
2月前
|
存储 Java
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
|
2月前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
2月前
|
Java 大数据 API
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。