Map,Collections和Arrays工具类

今日内容:Map,Collections和Arrays工具类


Map

Map中的put方法:
put方法可以将一组对象保存到Map中,返回当前key对应的原始value值。如果key是第一次出现返回的就是null,如果不是这个key已经存在于Map中,再次保存这个key-value时就会修改value值返回的是原来的value值

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Set;

//统计字符串中每个字符出现的次数
public class inteface {
	public static void main(String[] args) {
		String str="asdgasdf,zhe shi yi ge ceshizifuchuan!";
		times(str);
	}
	public static void times(String str){
		HashMap<Character, Integer> map=new HashMap<>();
		for (int i = 0; i < str.length(); i++) {
			Character c=str.charAt(i);
			if (map.containsKey(c)) {
				int time=map.get(c);//获取重复的键出现的次数,在此基础上++然后写进map就完成了更新value值的操作
				time++;//每重复一次就自增1
				map.put(c, time);
			}else
				map.put(c, 1);
		}
		//遍历一下吧
		Set<Entry<Character,Integer>> set=map.entrySet();
		Iterator<Entry<Character,Integer>> it=set.iterator();
		while (it.hasNext()) {
			Entry<Character,Integer> entry=it.next();
			Character key=entry.getKey();
			Integer value=entry.getValue();
			System.out.println(key+"..."+value);
			
		}
	}
}

HashMap:key采用哈希表算法,保证元素唯一,hashcode和equals方法。
TreeMap:key采用的是二叉树算法,保证元素唯一且按照自然顺序排序。
LinkedHashMap:key采用链表算法,保证元素唯一且保证存入取出顺序一致。

HashMap和HashTable的区别:
HashMap允许null作为键和值,是线程不安全对象,
HashCode不允许null作为键和值,是线程安全的对象。

HashMap中keySet和entrySet方法遍历的注意事项:
keySet: 返回值是一个Set集合。获取key的set集合,遍历key,然后根据HashMap中的get(key)方法获得对应的value值。
entrySet: 返回值是一个类型为Map.Entry<>的Set集合。该方法获得是key-value的关系。使用Map.Entry中的getKeygetValue方法取出对应的key和value值。
注意:HashMap中的values方法可以获得value值,返回类型为Collection,但是不能根据values值获得key的值,因为key的值是唯一的,但是value的值并不是唯一的。

案例一:输入一个字符串,判断每个字符出现的次数:

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class Demo5 {
	public static void main(String[] args) {
		String s = "asdfjljlsdfuowejlasjdfugsaljd";
		HashMap<Character, Integer> map = new HashMap<>();//这个集合只是拿来存结果的
		for (int i = 0; i < s.length(); i++) {
			Character key = s.charAt(i);
			if (map.containsKey(key)) {
				Integer value=map.get(key);
				value++;
				map.put(key, value);//每次循环新的value就会把旧的value给顶出去
			}else
				map.put(key, 1);
		}
		//遍历
		Set<Map.Entry<Character, Integer>> set=map.entrySet();
		for(Map.Entry<Character, Integer> met:set){
			Integer value=met.getValue();
			Character key=met.getKey();
			System.out.println(key+"..."+value);
		}
	}
}

JDK5.0的特性:
静态导入:
导入静态成员(方法,变量),为了简化代码。
import static 包名.类名.静态成员名;
导入静态成员之后,书写可以简化,比如导入了system.out之后,输出语句可以由System.out.println();简化成:out.println();,导入java.lang.Math之后,Math.abs()可以省略Math.直接写成abs();,缺点是阅读性变差了。

import static java.lang.System.out;
import static java.lang.Math.*;
import static java.util.Arrays.sort;

public class Demo7 {
	public static void main(String[] args) {
//		out.println("hello");//System.out.println("hello");
//		out.print("java");
//		double f = abs(1.23);//Math.abs(1.23);
//		long num = round(4.56);
//		sort(new int[]{1,2,3,4});//Arrays.sort(new int[]{1,2,3,4});
		
//		method(1,2,3,4,5);
//		method(11,22,33);
		method("",11,123,14,12);
	}

可变参数:
格式:数据类型… 变量名,实质是一个数组,可以按照数组的操作方式来用。
注意:如果参数列表有多个,可变参数一定要写在最后,因为写在前面,后面的参数永远得不到赋值,所有的值都被可变参数给接收了。

	public  static void  method(String b,int... a){	//可变参数
		System.out.println(a);
		System.out.println(a.length);//长度是数组的特性
		for(int num :a){		//遍历
			System.out.println( num);
		}
		System.out.println(a);
	}
Collections
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.TreeSet;

public class Demo8 {
	public static void main(String[] args) {
		ArrayList<String> list = new ArrayList<>();
		Collections.addAll(list, "2aa","1bbbb","5ccc","4dddddd"); //向集合中添加多个数据,可变参数
		
//		Collections.shuffle(list);//随机打乱list集合中的数据
//		Collections.sort(list); //将list集合按照自然顺序进行排序
//		Collections.sort(list, new Comparator<String>() {	//匿名内部类
//
//			@Override
//			public int compare(String s1, String s2) {
//				return s1.length() -s2.length();
//			}
//		}); //将list集合按照比较器的方式进行排序
//		Collections.reverse(list); //反转list
		//Collections.reverseOrder()返回一个比较器,逆转了原来的顺序,此时的比较器是默认顺序的比较器
//		TreeSet<String> set = new TreeSet<>(Collections.reverseOrder());//,此处是TreeSet的第二种构造方法,传入比较器

		//返回一个比较器,逆转了指定的比较器
		TreeSet<String> set = new TreeSet<>(Collections.reverseOrder(
				new Comparator<String>() {
				
					@Override
					public int compare(String s1, String s2) {
						return s1.length() - s2.length();
					}	
		}));	//逆转了传入的比较器
		set.add("aaa");
		set.add("cc");
		set.add("bbbb");
		set.add("mmmmmm");
		System.out.println(set);
		
//		System.out.println(list);
		
//		Collections.synchronizedList(list);//得到一个线程安全的list
	
	}
}

数组转换成集合可以用Arrays.asList()方法,注意list是固定长度,不能使用集合中的增删方法!!!要使用的话在new一个ArrayList对象就可以操作这个新的对象了

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Demo9 {
	public static void main(String[] args) {
		/*ArrayList<String> list = new ArrayList<>();
		list.add("aaa");
		list.add("bbb");
		list.add("ccc");
		
		Object[] obj = list.toArray(); //将集合转为数组,默认的是Object类型的!!
		for(Object o : obj)
			System.out.println(o);*/
		
	/*	String[]  arr = {"a","b","c"};
	//List<String> list = Arrays.asList("a","b","c");//可以直接写参数,因为这里是可变参数的
		List<String> list = Arrays.asList(arr); //将数组转为集合,注意list是固定长度,不能使用集合中的增删方法!!!
//		list.add("d");//不支持增删操作
//		list.remove("a");//不支持增删操作
*/		
		Integer[] arr = {new Integer(1),2,3,4};
		int[] arr1 = {1,2,3,4};
		
		List<Integer> l1 = Arrays.asList(arr);
		System.out.println(l1);//打印出数据本身,arr里面每个元素都是一个对象,转化成集合后,存储的都是地址值,但是toString被重写了,所以显示出数字
//		Integer in = new Integer(5);
//		System.out.println(in.toString());

		List<int[]> l2 = Arrays.asList(arr1);//注意数据类型是int[]
		System.out.println(l2);//打印地址值,因为此时arr1整体是一个对象,转化成集合后还是一个整体,他的toString没有被改写,打印出地址值。
		
	}
}

在这里插入图片描述
案例二:模拟实现扑克牌发牌过程

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;

//模拟实现斗地主,54张牌,2个王,三个人玩,地主20张,农民每人17张,
public class Demo6 {
	public static void main(String[] args) {
		String[] color = { "红桃", "黑桃", "方块", "梅花" };// key
		String[] number = { "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" };// value
		ArrayList<String> list = new ArrayList<>();
		for (int i = 0; i < color.length; i++) {
			for (int j = 0; j < number.length; j++) {
				list.add(color[i] + number[j]);
			}
		}
		list.add("大王");
		list.add("小王");
		Collections.shuffle(list);//洗牌
		ArrayList<String> dizhu = new ArrayList<>();
		ArrayList<String> farmer1 = new ArrayList<>();
		ArrayList<String> farmer2 = new ArrayList<>();
		dizhu.add(list.remove(0));//先给地主发三张,用remove方法,发一张少一张,符合要求
		dizhu.add(list.remove(0));
		dizhu.add(list.remove(0));
		for (int i = 0; i < 17; i++) {
			dizhu.add(list.remove(0));
			farmer1.add(list.remove(0));
			farmer2.add(list.remove(0));
		}
		System.out.println(dizhu);
		System.out.println(farmer1);
		System.out.println(farmer2);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值