java map存取重复值、幼儿园分班问题、map按key自动排序问题

本文介绍了一种使用Java编程语言设计的程序,该程序能够根据儿童的年龄将他们分配到小班(2-3岁)、中班(4-5岁)和大班(6岁)。通过重写map的put方法来处理相同年龄的多个儿童姓名,利用正则表达式进行分割,最终实现了年龄排序和班级人数统计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

8.童心幼儿园开学了,有一些适龄儿童入学,请设计一个分大班(6),中班(4-5),小班(2-3)的程序, 并在测试类中将结果输出出来

package $10_22;
	/**
	 * @desc 8.童心幼儿园开学了,有一些适龄儿童入学,请设计一个分大班(6),中班(4-5),小班(2-3)的程序,
	 * 并在测试类中将结果输出出来
	 * 思路:按年龄排序,然后多路决策分别存入三个容器中
	 * @param args
	 */
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
import java.util.Map.Entry;
/**
 * 
 * @desc 	重写map中的put实现当key重复时将新value追加到旧value后面
 * @author user
 *
 */
class mymap extends HashMap<Integer, String>{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@Override
	public String put(Integer key, String value) {
		Set<Integer> keys = this.keySet();
		for (Integer integer : keys) {
			if (key.equals(integer)) {//判断出key值相同
				String jiuValue = this.get(integer);//取出旧value
				value=jiuValue+","+value;//拼接
				break;
			}
		}
		return super.put(key, value);//返回调用父类
	}
}

class youErYuan {

	public static void main(String[] args) {
		//创建map容器,key为年龄,value为姓名
//		Map<Integer,String> map=new HashMap<Integer, String>();
		mymap map = new mymap();
		map.put(1, "一岁小哥");
		map.put(3, "李四");
		map.put(5, "李六");
		map.put(4, "李七");
		map.put(3, "李八");
		map.put(2, "李九");
		map.put(6, "李六");
		map.put(3, "李十");
		map.put(2, "张三");
		map.put(4, "王五");
		//打印输出结果
		Set<Integer> keys0 = map.keySet();
		for (Integer integer : keys0) {
			System.out.print("key=="+integer+"\t");
			System.out.println("value=="+map.get(integer));
		}
		System.out.println("------------------------");

		//list套map自定义比较器排序
		/**
		ArrayList<Map<Integer, String>> list = new ArrayList<Map<Integer, String>>();
		Collections.sort(list,new Comparator<Map<Integer, String>>() {

			@Override
			public int compare(Map<Integer, String> o1, Map<Integer, String> o2) {
				return 0;
			}
		});
		*/
		//entryset()自动排序
		Set<Entry<Integer, String>> keys = map.entrySet();
		//结果展示
		for (Entry<Integer, String> entry : keys) {
			System.out.print("key=="+entry.getKey()+"\tvalue=="+entry.getValue()+"\n");
		}
		System.out.println("---------------------------------");
		//创建大中小三个班级并统计班级人数
		List<String> xiaoBan=new ArrayList<String>();
		int xiaoBanren=0;
		List<String> zhongBan=new ArrayList<String>();
		int zhongBanren=0;
		List<String> daBan=new ArrayList<String>();
		int daBanren=0;
		String regex="[,]";
		for (Integer integer : keys0) {
			String[] ren = map.get(integer).split(regex);//正则表达式分割岁数相同的name
			int renShu=ren.length;//统计岁数相同的个数
			
			if (integer>=2 && integer<=3) {
				xiaoBanren+=renShu;//小班班级人数统计
				for (int i = 0; i < renShu; i++) {
					xiaoBan.add(ren[i]);
				}
			}else if (integer>=4 && integer<=5) {
				zhongBanren+=renShu;
				for (int i = 0; i < renShu; i++) {
					zhongBan.add(ren[i]);
				}
			}else if (integer==6) {
				daBanren+=renShu;
				for (int i = 0; i < renShu; i++) {
					daBan.add(ren[i]);
				}
			}else {
				System.out.println(map.get(integer)+"\t岁数不符合要求,无法分配班级");
			}
		}
		System.out.println("小班人数有"+xiaoBanren);
		System.out.println("中班人数有"+zhongBanren);
		System.out.println("大班人数有"+daBanren);
	}

}

结果
key==1	value==一岁小哥
key==2	value==李九,张三
key==3	value==李四,李八,李十
key==4	value==李七,王五
key==5	value==李六
key==6	value==李六
------------------------
key==1	value==一岁小哥
key==2	value==李九,张三
key==3	value==李四,李八,李十
key==4	value==李七,王五
key==5	value==李六
key==6	value==李六
---------------------------------
一岁小哥	岁数不符合要求,无法分配班级
小班人数有5
中班人数有3
大班人数有1

本来想着把年龄和姓名关联起来,然后按年龄排序把姓名分到不同的班。然鹅,map存值相同key值,新value会把就vale顶替。百度一下,大都为重写map的hashCode()和equals()方法。发现看不太懂。看了这位老哥写的:?
迫于无奈想到重写put方法.代码如上

重写put在存储之前加判断,判断之前是否存在相同key,存在就取出其value将其与新value组合,然后调用父类方法写入。取出时string.split(regex)分割出不同value.此方法只适用于string类型value
后来还要排序分组,但是发现已经拍好,研究
key为integer

	public static void main(String[] args) {
		HashMap<Integer, String> map = new HashMap<Integer, String>();
		map.put(7, "saodjf");
		map.put(3, "Iuadh");
		map.put(4, "sdfask");
		map.put(1,"sdhfka");
		Set<Integer> keys = map.keySet();
		for (Integer integer : keys) {
			System.out.println("key=="+integer+"\tvalue=="+map.get(integer));
		}
key==1	value==sdhfka
key==3	value==Iuadh
key==4	value==sdfask
key==7	value==saodjf

key为char类型

	public static void main(String[] args) {
		HashMap<Character, String> map = new HashMap<Character, String>();
		map.put('d', "sdhfa");map.put('r', "adfas");map.put('s', "sdjflkajs");
		map.put('e', "");
		Set<Character> keys = map.keySet();
		for (Character character : keys) {
			System.out.println("key=="+character+"\tvalue"+map.get(character));
		}
key==d	valuesdhfa
key==e	value
key==s	valuesdjflkajs
key==r	valueadfas

key为string类型

	public static void main(String[] args) {
		HashMap<String, String> map = new HashMap<String, String>();
		map.put("a", "我是1");map.put("s", "我是2");map.put("g", "我是3");
		map.put("h", "我是4");map.put("v", "我是5");
		Set<String> keys = map.keySet();
		for (String string : keys) {
			System.out.println("key=="+string+"\tvalue=="+map.get(string));
		}
key==v	value==我是5
key==g	value==我是3
key==s	value==我是2
key==a	value==我是1
key==h	value==我是4

string类型无自动排序。为撒嘞

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值