JAVA自学笔记18
JAVA自学笔记18
1、Map接口:
1)功能:
2)
Map<String,String>m=new HashMap<String,String>();
//添加元素,元素无序
System.out.println("map.put("cc","coco"));//null
//替换键值,返回该键的上一个值,若键不存在,返回null
System.out.println(map);//cc=coco,左边是键,右边是值
//map.clear();//清除所有元素
//System.out.printn(map.remove("cc"));//coco。若键存在,则删除该键,返回该键的键值。若不存在,返回null
System.out.println(map.containsKey("cc"));true.//集合存在该键,则返回true。若不在,则返回false
System.out.println(map.containsKey(map.isEmpty()));//集合为空,则返回false
System.out.println(map.containsKey(map.size);//返回集合中键的数目
//获取功能
System.out.println((map.get(cc));//coco。将获取该键的键值,若键不存在,将返回null
Set<String> set=map.keyset();
for(String key:set){
System.out.println(key);
}//将返回所有的键
Collection<String>con=map.values();
for(String value:value){
System.out.println(value);
}//将返回所有的键值
//Map集合的遍历-方式1依键寻值
//获取所有的键-遍历键的集合,获取得到每一个键-根据键去找值
Map<String,String>m=new HashMap<String,String>();
map.put("cc","coco");
map.put("jc","jack");
Set<String> set=map.keyset();
for(String key:set){
Strng value=map.get(key);
System.out.println(value);
}
//Map集合的遍历-方式2
//获取所有的键值段的集合
//遍历键值对对象的集合,得到每一个键值对对象
//根据键值对对象获取键和键值
//键值对对象的表示:Set<Map.Entry<K,V>>entrySet()l;返回键值对对象的集合
Set<Map.Entry<String,String>>set=map.entrySet();
for(Map.Entry<String,String>me:set){
String key=me.getKey();
String value=me.getValue();
}
3)两种遍历方式的图解
2、HashMap
1)键是哈希表结构,可以保证键的唯一性,是Map的接口实现
2)HashMap
//创建集合对象
HashMap<String,String>hm=new HashMap<String,String>();
hm.put("cc","coco");
hm.put("jc","jack");
Set<String>set=hm.keySet();
for(String key:Set){
String value=hm.get(key);
System.out.println(value);
}
3)HashMap
HashMap<Integer,String>=new HashMap<Integer,String>();
Integer i=new Integer(55);
String s="jack";
hm.put(i,s);
hm.put(14,"coco");
Set<Integer>set=hm,keySet();
for(Integer key:set){
String value=hm.get(key);
}
4)HashMap
//Student类略
HashMap<String,Student>hm=new HashMap<String,Student>();
Student s1=new Student("coco",22);
Student s1=new Student("kiki",23);
//添加元素
hm.put("5414",s1);
hm.put("5415",s2);
//遍历
Set<String>set=hm.keySet();
for(String key:set){
Student value=hm.get(key);
}
5)HashMap
//创建集合对象
HashMap<Student,String>hm=new HashMap<Student,String>();
//创建学生对象
Student s1=new Student("coco",22);
Student s1=new Student("kiki",23);
//添加元素
hm.put(s1,"3f4d");
hm.put(s2,"4f4h");
//遍历
Set<Student>set=hm.keySet();
for(Student key:set){
String value=hm.get(key);
//若出现某几个对象成员变量相同但出现了多次该键时,在Student类中生成HashCode()和equal()即可
}
3、LinkedHashMap
1)Map接口的哈希表和链接列表实现,具有可预知的迭代顺序。即键是有序的
2)
LinkedHashMap<String,String>hm=new LinkedHashMap<String,String>();
hm.put("1223","dd");
hm.put("1223","wd");
hm.put("1233","qd");
for(String key:set){
String value=hm.get(key);//输出语句中重复的将覆盖
}
4、TreeMap类
1)键为红黑树结构,可以保证键的排序和唯一性
2)TreeMap集合键是String值是String的案例
TreeMap<String,String>tm=new TreeMap<String,String>;
tm.put("coco","cc");
tm.put("jack","jc");
set<String>set=tm.eySet();
for(String key:set){
String value=tm.get(key);
//使用的是自然排序
}
3)TreeMap集合键是Student值是String的案例
TreeMap<String,String>tm=new TreeMap<String,String>(new Comparator<Student>(){
public int compare(Student s1,Student s2){
int num=s1.getAge()-s2.getAge();
//以下是次要条件
int num2=num==0?s1.getName().compareTo(s2.getName()):num;
return num2;
}
});//比较器排序,按年龄从低到高排序
Student s1=new Student ("kiki",23);
Student s2=new Student ("jiji",24);
tm.put(s1,"5821");
tm.put(s1,"5851");
set<String>set=tm.keySet();
for(String key:set){
String value=tm.get(key);
//要重写compareTo方法实现Comparable接口才能实现自然排序
@例题1:统计字符串中每个字符出现的次数
图解
Scannner sc=new Scanner(System.in);
//键盘录入一个字符串
String line=sc.nextLine();
//定义TreeMap集合
TreeMap<Character,Integer>tm=new TreeMap<Character,Integer>();
//把字符串转换为字符数组
char[] chs=line,toCharArray();
//遍历数组
for(char ch:chs){
Integer i=tm.get(ch,1);
}else{
i++;
tm.put(ch,i);
}}
StringBuilder sb=new StringBuilder();
Set<Character>set=tm.keySet();
for(Character key:set){
Integer value=tm.get(key);
sb.append(key).append)("(").append(value).append(")");
String result=sb.toString;
System.out,println(result);
}
@例题3:HashMap嵌套HashMap
//创建集合对象
HashMap<String,HashMap><String,Integer>>czbkMap=new HashMap<String,HashMap><String,Integer>>();
//创建基础班集合对象
HashMap<String,Integer>jcMap=new HashMap<String,Integer>();
jcMap.put("cc",12);
jcMap.put("bb",14);
//添加到大集合中
czbkMap.put("jc",jcMap);
//创建就业班集合对象
HashMap<String,Integer>jyMap=new HashMap<String,Integer>();
jcMap.put("aa",13);
jcMap.put("dd",15);
//添加到大集合中
czbkMap.put("jy",jyMap);
//遍历集合
Set<String>czbkMapSet=czbkMap.keySet();
for(String czbkMapKey:czbkMapSet){
HashMap<String,Integer>czbkMapValue=czbkMap.get(czbkMapSet);
Set<String > czbkMapValueSet=czbkMapValueSet.keySet();
for(String czbkMapValueKey:czbkMapValueSet){
Integer czbkMapValueValue=czbkMapValue.get(czbkMapValueKey);
System.out,println(czbkMapValueKey+","czbkValueValue);
}
}
@例题4:HashMap集合嵌套ArrayList
//创建集合对象
HashMap<String,ArrayList<String>>hm=new HashMap<String,ArrayList<String>>();
//创建元素集合1
ArrayList<String>array1=new ArrayList<String>();
array1.add("黄盖");
array1.add("孙权");
bjczbkMap.put("jc",array1)
bjczbkMap.put("jc",array2)
hm.put("三国","array1");//添加键
//创建元素集合2
ArrayList<String>array2=new ArrayList<String>();
array3.add("孙悟空");
array3.add("观音");
hm.put("西游记","array2");//添加键
//创建元素集合1
ArrayList<String>array3=new ArrayList<String>();
array4.add("贾宝玉");
array4.add("薛宝钗");
bjczbkMap.put("jc",array3)
bjczbkMap.put("jc",array4)
hm.put("红楼","array3");//添加键
//遍历集合
Set<String>set=hm.keySet();
for(String key:set){
System.out.println(key);
ArrayList<String> array=hmget(key);
for(String s:value){
System.out.println("\t"+s);
}
}
@例题6:ArrayListq嵌套HashMap
//创建集合对象
ArrayList<HashMap><String.String>>array=new ArrayList<HashMap<String,String>>();
//创建元素1
HashMap<String,String>hm1=new HashMap<String,String>();
hm1.put("周瑜","小乔");
hm1.put("吕布","貂蝉");
//把元素添加到array里
array.add(hm1);
//创建元素2
HashMap<String,String>hm1=new HashMap<String,String>();
hm1.put("牛魔王","铁扇");
hm1.put("金角","银角");
//把元素添加到array里
array.add(hm2);
//创建元素1
HashMap<String,String>hm1=new HashMap<String,String>();
hm1.put("牛肉","牛肉面");
hm1.put("陈靖仇","于小雪");
//把元素添加到array里
array.add(hm1);
//遍历
for(HashMap<String,String>hm:array){
Set<String>set=hm.keySet();
for(String key:set){
String value=hm.get(key);
System.out.println(key+" "+value)
}
}
@例题7:HashMap嵌套HashMap嵌套HashMap
//创建大集合
HashMap<String,HashMap<String,ArrayList<Student>>>czbkMap=new HashMap<String,HashMap<String,ArrayList<Student>>>();
//北京校区
HashMap<String,ArrayList<Student>> bjczbkMap=new HashMap<String,ArrayList<Student>>();
ArrayList<Student>array1=new ArrayList<Student>();
Student s1=new Student("林青霞","27");
Student s2=new Student("风清扬","30");
array1.add(s1);
array1.add(s2);
ArrayList<Student>array2=new ArrayList<Student>();
Student s3=new Student("董存瑞","17");
Student s4=new Student("李云龙","60");
array2.add(s3);
array2.add(s4);
//其余类比不再给出
//遍历集合
Set<String>czbkMapSet=czbkMap.keySet();
for(String czbkMapKey:czbkMapSet){
for(String czbkMapKey:czbkMapSet){
System,out.println(czbkMapKey);
HashMap<String,ArrayList<Student>>czbkMapValue=cabkMap.get(czbkMapKey);
set<String>czbkMapValueSet=czbkMapValue.keySet();
for(String czbkMapValueKey:czbkMapValueSet){
ArrayList<Student>czbkMapValueValue=czbkMapValue.get(czbkMapValueKey);
for(Student s:czbkMapValueValue){
System.out.println(s.getName);
}
}
}
}
@例题8:HashMap与Hashtable的区别
Hashtable:此类实现一个哈希表,与HashMap用法几乎一样,但它不允许null键和null值 。它是同步的,HashMap是不同步的。
@例题9:Ltst,Set,Map接口是否都继承自Map接口?
List,Set不继承自Map接口,它们继承自Collection接口,Map本身就是一个顶层接口
2、Collections类:
1)针对集合操作的工具类
2 )Collection与Collections的区别:前者是单列集合的顶层接口。后者是对集合操作的工具类
3)成员方法
①public static <T> void sort(List<T>List)
排序。默认进行自然排序
public static <T> int binarySearch(List<?>list,T key)
进行二分查找
public static <T> max(collection<?> coll)
求最大值
public static void reverse(List<?>list)
反转
public static void shuffle (List<?>list)
随机置换
List<Integer>list=new ArrayList<Integer>()'
list.add(20);
list.add(30);
list.add(10);
list.add(60);
list.add(5);
list.add(200);
Collections.sort(list);
int index=Collections(list,10);
System.out.println(Collections.max(list));
Collections.reverse(list);
Collections.shuffle(list);
@例题10:ArrayList存储自定义对象并排序
//学生类略
Public class Student implements Comparable<Student>{
public int compareTo(Student s){
int num=this.age-s.age;
int num2=num==0?this.name.comparaTo(s.name):num;
return num2;
}
List<Student>list=new ArrayList<Student>();
Student s1=new Student("huh",34);
Student s2=new Student("hh",44);
list.add(s1);
list.add(s2);
//自然排序
//collections.sort(list);
//比较器排序,以比较器为主
Collections.sort(list,new Comparator)<Student>(){
public int compare(Student s1,Student s2){
int num=s2.getAge()-s1.getAge();
return num;
}
})
for(Student s:List){
System.out.println(s.getName())
}
@例题11:模拟斗地主洗牌和发牌
ArrayList<String> array=new ArrayList<String>();
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){
array.add(color.concat(number));
}
}
array.add(大王);
array.add(小王);
//洗牌
Collections.shuffle(array);
//发牌
ArrayList<String>p1=new ArrayList<String>();
ArrayList<String>p2=new ArrayList<String>();
ArrayList<String>p3=new ArrayList<String>();
ArrayList dipai=new ArrayList<String>();
for(int x=0;x<array.size();x++){
if(x>array.size()-3){
diPai.add(array.get(x));
else if(x%3==0){p1.add(array.get(x))
}
else if(x%3==1){p2.add(array.get(x))
}
else if(x%3==2){p3.add(array.get(x))
}
}
}
//看牌
lookPoker("p1",p1);
lookPoker("p2",p2);
lookPoker("p3",p3);
public static void lookPoker(String name,ArrayList<String>array){
System.out.println(name+"的牌是");
for(String s:array){
System.out.println(s+" ")
}
System.out.println(" ")
}
图解:
//完整代码
//创建一个HashMap集合
//创建一个ArrayList集合
//创建花色和点数数组
//从0开始往HashMap里面存储编号,并存储对应的牌。同时往ArrayList里面存储编号即可
//洗牌(洗的是编号)
//发牌(发的是编号,为了使得在看牌时编号是排序的,就创建TreeSet集合接收)
//看牌(遍历TreeSet集合,获取编号,到HashMap里找对应的牌)
//创建一个HashMap集合
// 创建一个HashMap集合
HashMap<Integer, String> hm = new HashMap<Integer, String>();
// 创建一个ArrayList集合
ArrayList<Integer> array = new ArrayList<Integer>();
// 创建花色数组和点数数组
// 定义一个花色数组
String[] colors = { "♠", "♥", "♣", "♦" };
// 定义一个点数数组
String[] numbers = { "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q",
"K", "A", "2", };
// 从0开始往HashMap里面存储编号,并存储对应的牌,同时往ArrayList里面存储编号即可。
int index = 0;
for (String number : numbers) {
for (String color : colors) {
String poker = color.concat(number);
hm.put(index, poker);
array.add(index);
index++;
}
}
hm.put(index, "小王");
array.add(index);
index++;
hm.put(index, "大王");
array.add(index);
// 洗牌(洗的是编号)
Collections.shuffle(array);
// 发牌(发的也是编号,为了保证编号是排序的,就创建TreeSet集合接收)
TreeSet<Integer> fengQingYang = new TreeSet<Integer>();
TreeSet<Integer> linQingXia = new TreeSet<Integer>();
TreeSet<Integer> liuYi = new TreeSet<Integer>();
TreeSet<Integer> diPai = new TreeSet<Integer>();
for (int x = 0; x < array.size(); x++) {
if (x >= array.size() - 3) {
diPai.add(array.get(x));
} else if (x % 3 == 0) {
fengQingYang.add(array.get(x));
} else if (x % 3 == 1) {
linQingXia.add(array.get(x));
} else if (x % 3 == 2) {
liuYi.add(array.get(x));
}
}
// 看牌(遍历TreeSet集合,获取编号,到HashMap集合找对应的牌)
lookPoker("风清扬", fengQingYang, hm);
lookPoker("林青霞", linQingXia, hm);
lookPoker("刘意", liuYi, hm);
lookPoker("底牌", diPai, hm);
}
// 写看牌的功能
public static void lookPoker(String name, TreeSet<Integer> ts,
HashMap<Integer, String> hm) {
System.out.print(name + "的牌是:");
for (Integer key : ts) {
String value = hm.get(key);
System.out.print(value + " ");
}
System.out.println();
}
JAVA自学笔记18的更多相关文章
- JAVA自学笔记24
JAVA自学笔记24 1.能使用同步代码块就使用同步代码块,除非锁对象是this,就可以考虑使用同步方法.静态方法的锁是类的字节码对象. 2.JDK5新特性 1)接口Lock void Lock()/ ...
- JAVA自学笔记27
JAVA自学笔记27 1.类的加载 1)当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. ①加载:就是指将class文件读入内存,并为之创 ...
- JAVA自学笔记09
JAVA自学笔记09 1.子类的方法会把父类的同名方法覆盖(重写) 2.final: 1)可修饰类.方法.变量 2)修饰类时:此时该类变为最终类,它将无法成为父类而被继承 3)修饰方法时:该方法将无法 ...
- JAVA自学笔记05
JAVA自学笔记05 1.方法 1)方法就是完成特定功能的代码块,类似C语言中的函数. 2)格式: 修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2,-){ 函数体; return ...
- JAVA自学笔记06
JAVA自学笔记06 1.二维数组 1)格式: ①数据类型[][]数组名 = new 数据类型[m][n]; 或 数据类型[]数组名[]=new 数据类型[m][n]; m表示这个二维数组有多少个一维 ...
- JAVA自学笔记04
JAVA自学笔记04 1.switch语句 1)格式:switch(表达式){ case 值1: 语句体1; break; case 值2: 语句体2; break; - default: 语句体n+ ...
- JAVA自学笔记07
JAVA自学笔记07 1.构造方法 1) 例如:Student s = new Student();//构造方法 System.out.println(s);// Student@e5bbd6 2)功 ...
- JAVA自学笔记10
JAVA自学笔记10 1.形式参数与返回值 1)类名作为形式参数(基本类型.引用类型) 作形参必须是类的对象 2)抽象类名作形参 需要该抽象类的子类对象,通过多态实现 3)接口名为形参 需要的是该接口 ...
- JAVA自学笔记13
JAVA自学笔记13 1.StringBuffer类 1)线程安全的可变字符序列 线程安全(即同步) 2)StringBuffer与String的区别:一个可变一个不可变 3)构造方法: ①publi ...
随机推荐
- @transactional注解下失效
这几天在项目里面发现我使用@Transactional注解事务之后,抛了异常居然不回滚.后来终于找到了原因. 如果你也出现了这种情况,可以从下面开始排查. 一.特性 先来了解一下@Transactio ...
- noi2018d2t1
题解: ex-crt 学习见https://www.cnblogs.com/Miracevin/p/9254795.html hdu2891 #include <cstdio> #incl ...
- (一)cygwin和vim——hello world!
好吧,我现在初出茅庐,一无所有,只有一台win xp.做什么呢?要不要试试Unix命令行编程的感觉,想到就做.Just try! 1.首先安装cygwin,最好是选择离线安装包. 2.默认选择安装所有 ...
- Python 多进程multiprocessing
一.python多线程其实在底层来说只是单线程,因此python多线程也称为假线程,之所以用多线程的意义是因为线程不停的切换这样比串行还是要快很多.python多线程中只要涉及到io或者sleep就会 ...
- AtCoder Grand Contest 026 (AGC026) E - Synchronized Subsequence 贪心 动态规划
原文链接https://www.cnblogs.com/zhouzhendong/p/AGC026E.html 题目传送门 - AGC026E 题意 给定一个长度为 $2n$ 的字符串,包含 $n$ ...
- {}动态规划}记忆化dp
先搞个模板 #include<stdio.h> #include<string.h> using namespace std; typedef long long ll; ]; ...
- P2024 [NOI2001]食物链 并查集
题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都是 A,B,C 中的一种,但是我 ...
- day 68 django 之api操作 | jQueryset集合与对象
我们的orm里面分为: jQueryset集合, 还有对象, 我们的jqueryset集合里面可以有多个对象,这句话的意思就是我们的对象是最小的单位,不可以再拆分了,我们的jQueryset集合就相当 ...
- 3dsmax不同版本 pyside qt UI 设置max窗口为父窗口的方法
3dsmax不同版本 pyside qt widget 设置 max 窗口为父窗口的方法 前言: 3dsmax 在 2014 extension 之后开始集成 Python 和 PySide,但是在版 ...
- 大数据小白系列——HDFS(2)
这里是大数据小白系列,这是本系列的第二篇,介绍一下HDFS中SecondaryNameNode.单点失败(SPOF).以及高可用(HA)等概念. 上一篇我们说到了大数据.分布式存储,以及HDFS中的一 ...