java學習--day14--Map
Map
為了方便存取鍵值對關係的資料,引入Map集合,資料的查重只和鍵有關,和值無關
和Collection想比,前者屬於單列集合,而後者屬於雙列集合
一.HashMap
底層資料結構是雜湊表HashMap,允許使用null值和null鍵,如果鍵相同,則值覆蓋,返回上一次的值
put(); 往Map集合中新增鍵和值
clear(); 清空全部元素
remove(); 刪除某一個鍵,根據鍵刪除整個鍵值對
get(); 根據鍵找到鍵值對
values(); 將所有值放入一個Collection中,得到所有的值
set(); 獲取所有的鍵,放入一個Set中
size(); 獲取集合的長度
遍歷map集合的方式,
1.方式一:鍵找值,通過方法得到key集合,進行遍歷通過key找到value
import java.util.HashMap; import java.util.Set; public class HashMapDemo1 { public static void main(String[] args) { HashMap<Integer, String> map = new HashMap<>(); map.put(001, "奧特之父"); map.put(002, "皮"); map.put(003, "99號技師"); map.put(004, "大熊貓"); map.put(005, "我叫圓圓高"); Set<Integer> keys = map.keySet(); for(Integer key: keys) { System.out.println(key + "---" + map.get(key)); } } }
方法:entrySet();然後遍歷鍵值對物件集合
getKey(); getValue(); 通過物件呼叫方法獲取鍵和值
import java.util.HashMap; import java.util.Map; import java.util.Set; public class MapDemo4 { public static void main(String[] args) { Map<String, String> hm = new HashMap<String, String>(); map.put(001, "奧特之父"); map.put(002, "皮"); map.put(003, "99號技師"); map.put(004, "大熊貓"); map.put(005, "我叫圓圓高"); Set<Map.Entry<String, String>> entries = hm.entrySet(); for (Map.Entry<String, String> entry : entries) { String key = entry.getKey(); String value = entry.getValue(); System.out.println(key + "===" + value); } } }
關於鍵和值的儲存:如果鍵不同,就算值一樣也能存進去,如果鍵相同,則要看鍵是基本型別還是引用型別,因為引用型別建立物件地址值是不同的,如果想要引用型別的鍵不可重複,則要重寫equals方法和hashcode方法(原理和HashSet一樣)
import java.util.HashMap;
import java.util.Set;
public class HashMapDemo4 {
public static void main(String[] args) {
HashMap<Student, String> hm = new HashMap<>();
hm.put(new Student("Lucy",18),"s001");
hm.put(new Student("Jack", 40), "s002");
hm.put(new Student("Mary", 40), "s002");
hm.put(new Student("Lucy", 40), "s002");
hm.put(new Student("White", 40), "s002");
hm.put(new Student("BOb", 40), "s003");
hm.put(new Student("Jack", 40), "s007");
//map集合的資料結構跟鍵有關
Set<Student> students = hm.keySet();
for(Student student:students){
String s = hm.get(student);
System.out.println(student.getName()+"==="+s);
}
}
}
import java.util.Objects;
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
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 boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age &&
Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
LinkedHashMap:有序(儲存順序)不可重複,底層是連結串列和雜湊表,和前面例子大致相同,只是輸出結果按輸入順序輸出
TreeMap:有序(按照鍵排序)不可重複,底層是二叉樹和雜湊表,不允許存入null鍵,可以存入null值
同樣的有兩種比較方法:有參和無參;原理和上一篇部落格中的TreeSet一樣,需要實現介面和重寫方法,在此不再作過多贅述,用有參構造進行演示
import java.util.Comparator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
public class TreeMapTest1 {
public static void main(String[] args) {
TreeMap<Student, Integer> stuTree = new TreeMap<>(new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
int result = o1.getAge() - o2.getAge();
int lastResult = result == 0 ? o1.getName().compareTo(o2.getName()) : result;
return lastResult;
}
});
stuTree.put(new Student("奧特之父", 20), 001);
stuTree.put(new Student("你捅我兩刀吧", 20), 001);
stuTree.put(new Student("007", 21), 001);
stuTree.put(new Student("奧特之父", 20), 003);
stuTree.put(new Student("大熊貓", 22), 004);
Set<Map.Entry<Student, Integer>> entries = stuTree.entrySet();
for(Map.Entry<Student, Integer> entry: entries) {
Student stu = entry.getKey();
Integer i = entry.getValue();
System.out.println(stu.getName() + "---" + stu.getAge() + "---" + i);
}
}
}
public class Student {
private String name;
private int age;
構造方法
...
...
重寫方法
}
例題:判斷字元出現頻度,"aababcabcdabcde", 獲取字串中每一個字母出現的次數要求結果:a(5) b(4) c(3) d(2) e(1)
import javax.sound.midi.Soundbank;
import java.util.HashMap;
import java.util.Scanner;
import java.util.Set;
public class MyMapDemo {
public static void main(String[] args) {
HashMap<Character, Integer> map = new HashMap<>();
Scanner sc = new Scanner(System.in);
System.out.println("請隨便輸入一段字串");
String line = sc.next();
for (int i = 0; i < line.length(); i++) {
//獲取單個字元
char key = line.charAt(i);
if (map.get(key) == null) { //第一次存入資料,將null改為1
map.put(key, 1);
} else { //如果不是第一次輸入,則將值加1即可
Integer value = map.get(key);
value++;
map.put(key, value);
}
}
//遍歷集合拼串
StringBuffer sb = new StringBuffer();
Set<Character> characters = map.keySet();
for(Character ch:characters){
sb.append(ch).append("(").append(map.get(ch)).append(")");
}
String s = sb.toString();
System.out.println("你要的結果"+s);
}
}
加強:HashMap的巢狀
//儲存下列資料
//基礎班
// 張三 20
// 李四 22
//就業班
// 王五 21
// 趙六 23
import java.util.HashMap;
import java.util.Set;
public class MapDemo2 {
public static void main(String[] args) {
//HashMap 巢狀 HashMap
HashMap<String, Integer> jc = new HashMap<>();
jc.put("張三", 20);
jc.put("李四", 22);
HashMap<String, Integer> jy = new HashMap<>();
jy.put("王五", 21);
jy.put("趙六", 23);
//建立一個map集合
HashMap<String, HashMap<String, Integer>> bigMap = new HashMap<>();
bigMap.put("基礎班", jc);
bigMap.put("就業班", jy);
//遍歷 鍵找值
Set<String> keys = bigMap.keySet();
for (String k : keys) {
System.out.println(k);
HashMap<String, Integer> value = bigMap.get(k);
Set<String> strings = value.keySet();
for (String s : strings) {
System.out.println("\t" + s + "==" + value.get(s));
}
System.out.println();
}
}
}
巢狀的再次練習
//儲存下列資料
//三國演義
// 呂布
// 周瑜
// 笑傲江湖
// 令狐沖
// 林平之
//神鵰俠侶
// 郭靖
// 楊過
import java.net.SocketTimeoutException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MyMapDemo3 {
public static void main(String[] args) {
//把上面這組資料存起來 HashMap 巢狀List
ArrayList<String> sgyy = new ArrayList<>();
sgyy.add("呂布");
sgyy.add("周瑜");
ArrayList<String> xajh = new ArrayList<>();
xajh.add("令狐沖");
xajh.add("林平之");
ArrayList<String> sdxl = new ArrayList<>();
sjxl.add("郭靖");
sjxl.add("楊過");
HashMap<String, ArrayList<String>> hm = new HashMap<>();
hm.put("笑傲江湖", xajh);
hm.put("神鵰俠侶", sdxl);
hm.put("三國演義", sgyy);
//遍歷
Set<Map.Entry<String, ArrayList<String>>> entries = hm.entrySet();
for (Map.Entry<String, ArrayList<String>> en : entries) {
String key = en.getKey();
System.out.println(key);
ArrayList<String> value = en.getValue();
for (String k : value) {
System.out.println("\t"+k);
}
System.out.println();
}
}
}
集合中 collections常用方法:
集合的排序:new一個比較器,用比較器排序
二分查詢:bianrySearch()
最大值最小值:max(),min()
元素反轉:reverse();
隨即打亂集合中的元素:shuffle();