概述
0--星期日
1--星期一
...
有對應關系倡怎,對應關系的一方是有序的數(shù)字层玲,可以將數(shù)字作為角標歇盼。
public String getWeek(int num){
if(num<0 || num>7)
throw new NoWeekException(num+"沒有對應的星期");
String[] weeks = {"","星期一"...."星期日"};//一張表如捅。記錄對應關系袭祟。換成List集合亏掀。
return weeks[num];
}
新需求:
"星期一"--"Monday"
....
"星期日"--"Sunday"
也存在對應關系缸榄,沒有一方是有序的數(shù)字渤弛,無法作為角標存在。咋辦?
0--星期日
1--星期一
...
int index = listcn.indexOf("星期一")
listen.get(index);
0--Sunday
1--Monday
...
解決中英對應問題甚带,可以通過兩個List完成她肯。
一個list中通過中文獲取對應角標。在用角標到另一個英文list中獲取對應的星期英文鹰贵。
前提:必須保證中英文對應的角標是一致的晴氨。
麻煩!Collection集合一次只能存儲一個元素碉输。希望的將兩個有對應關系的一次都存儲進去籽前。這樣更便于操作。
集合框架中是否有提供解決方案敷钾?找到了Map集合枝哄。
Map
Map
|--Hashtable:數(shù)據(jù)結構:哈希表。是同步的阻荒,不允許null作為鍵和值挠锥。被hashMap替代。
|--Properties:屬性集财松,鍵和值都是字符串,而且可以結合流進行鍵值的操作纱控。
|--HashMap:數(shù)據(jù)結構:哈希表辆毡。不是同步的,允許null作為鍵和值甜害。
|--LinkedHashMap:基于鏈表+哈希表舶掖。可以保證map集合有序(存入和取出的順序一致)尔店。
|--TreeMap:數(shù)據(jù)結構:二叉樹眨攘。不是同步的∠荩可以對map集合中的鍵進行排序鲫售。
什么時候使用map集合呢?
分析問題時出現(xiàn)對應關系该肴,毫不猶豫的想到map集合情竹。
如果對應關系中出現(xiàn)了有序的數(shù)字,想到數(shù)組匀哄。
注意:如果對應關系個數(shù)不確定秦效,還是以map為主雏蛮。
Map集合特點
1,內部存儲的都是鍵key值value對阱州。
2挑秉,必須要保證的鍵的唯一性。
Map常見功能
1苔货,存儲犀概。v put(k,v);
2,獲取蒲赂。v get(k);
3阱冶,移除。v remove(k);
4滥嘴,Set<k> keySet();
5木蹬,Set<Map.Entry<k,v>> entrySet();
6,Collection<v> values();
Map基本使用
public static void main(String[] args) {
/*
* 存儲中英文星期若皱。
* 使用map集合镊叁。
*/
Map<String,String> map = new HashMap<String,String>();
//添加元素。
System.out.println(map.put("星期一", "Monday"));
// System.out.println(map.put("星期一", "Mon"));//如果鍵相同走触,值覆蓋晦譬。并put方法會返回舊值。如果沒有舊值就null互广。
//....
map.put("星期日", "Sunday");
//通過給定鍵獲取值敛腌。
String value = map.get("星期二");//如果鍵 不存在,返回null惫皱,通過此判斷鍵的是否存在像樊。
System.out.println("value="+value);
//刪除元素。根據(jù)鍵刪除旅敷。
String s = map.remove("星期一");//獲取給定鍵對應的值生棍,并將該鍵值對從map集合刪除。
System.out.println("s="+s);
System.out.println(map);
}
-
keySet()媳谁、entrySet()涂滴、values()
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class MapDemo2 {
/**
* @param args
*/
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("星期一", "Monday");
map.put("星期日", "Sunday");
System.out.println("------------keySet方法的獲取---------------");
// System.out.println(map.get("星期一"));
//怎么獲取到所有的鍵呢?既然是所有的鍵晴音,應該是一個集合柔纵,而且是一個單列集合。
//list還是set呢锤躁?應該是set首量,因為map集合中鍵需要保證唯一性。
//找到一個方法 Set<k> keySet();獲取map集合中的鍵的set集合。
Set<String> keySet = map.keySet();
for(Iterator<String> it= keySet.iterator(); it.hasNext() ; ){
String key = it.next();
String value = map.get(key);//通過鍵獲取對應的值加缘。
System.out.println(key+"::"+value);
}
//使用foreach循環(huán)鸭叙,進行遍歷。
for(String key : keySet){
System.out.println(key+":::::"+map.get(key));
}
System.out.println("-----------entrySet方法獲取----------------");
/*
* Set entrySet():將map集合中映射關系存儲到了Set集合中.
* 映射關系:其實就是指鍵和值的對應關系拣宏。其實就是夫妻的結婚證沈贝。
* 映射關系是什么類型的呢? Map.Entry
*/
Set<Map.Entry<String,String>> entrySet = map.entrySet();
Iterator<Map.Entry<String, String>> it = entrySet.iterator();
//遍歷Set中的映射關系對象勋乾。
while(it.hasNext()){
Map.Entry<String, String> me = it.next();//取到了映射關系對象宋下。
//獲取鍵。
String key = me.getKey();
//獲取值辑莫。
String value = me.getValue();
System.out.println(key+"-----"+value);
}
/*
* 總結:map集合沒有迭代器学歧,取出元素的方式:將map集合轉成單列結合,在使用單列集合的迭代器就可以了各吨。
* map集合也不能直接被foreach循環(huán)遍歷枝笨。
*/
for(Map.Entry<String,String> me : map.entrySet()){
String key = me.getKey();
//獲取值。
String value = me.getValue();
System.out.println(key+"--------"+value);
}
System.out.println("-----------獲取所有值的方法 values()----------------");
/*
* 獲取所有的值揭蜒,因為值不需要保證唯一性横浑。所以返回類型時Collection。
* 姓名--歸屬地屉更。對應關系徙融,獲取所有的歸屬地。values();
*/
//所有的英文星期瑰谜。
Collection<String> values = map.values();
for(String value : values){
System.out.println("value:"+value);
}
}
}
HashMap存儲自定義對象
public class Student implements Comparable<Student> {
private String name;
private int age;
public Student() {
super();
}
public Student(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 int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
}
public class HashMapTest {
public static void main(String[] args) {
/*
* 練習一:
* 學生對象(姓名欺冀,年齡)都有自己的歸屬地,既然有對應關系萨脑。
* 將學生對象和歸屬地存儲到map集合中隐轩。
* 注意:同姓名同年齡視為重復的鍵。
*/
//1,創(chuàng)建hashmap集合對象砚哗。
Map<Student,String> map = new HashMap<Student,String>();
//2,添加元素龙助。
map.put(new Student("lisi",28), "上海");
map.put(new Student("wangwu",22), "北京");
map.put(new Student("zhaoliu",24), "成都");
map.put(new Student("zhouqi",25), "廣州");
map.put(new Student("wangwu",22), "南京");
//3,取出元素砰奕。keySet entrySet
// Set<Student> keySet = map.keySet();
// for(Student key : keySet){}
for(Student key : map.keySet()){
String value = map.get(key);
System.out.println(key.toString()+"....."+value);
}
}
}
TreeMap存儲自定義對象
public class ComparatorByName implements Comparator<Student> {
@Override
public int compare(Student o1, Student o2) {
int temp = o1.getName().compareTo(o2.getName());
return temp==0?o1.getAge() - o2.getAge() : temp;
}
}
public class Student implements Comparable<Student> {
private String name;
private int age;
public Student() {
super();
}
public Student(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 int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
@Override
public int compareTo(Student o) {
int temp = this.age - o.age;
return temp==0?this.name.compareTo(o.name):temp;
}
}
public class TreeMapTest {
/**
* @param args
*/
public static void main(String[] args) {
/*
* 練習二: 學生對象(姓名蛛芥,年齡)都有自己的歸屬地,既然有對應關系军援。 將學生對象和歸屬地存儲到map集合中仅淑。
* 注意:同姓名同年齡視為重復的鍵。 按照學生的年齡進行從小到大的排序胸哥。 TreeMap涯竟。
*
* 如果要對學生按照姓名排序呢?
*/
// 1,創(chuàng)建TreeMap集合對象。
Map<Student, String> map = new TreeMap<Student, String>(new ComparatorByName());
// 2,添加元素庐船。
map.put(new Student("lisi", 28), "上海");
map.put(new Student("wangwu", 22), "北京");
map.put(new Student("zhaoliu", 24), "成都");
map.put(new Student("zhouqi", 25), "廣州");
map.put(new Student("wangwu", 22), "南京");
//3,取出所有元素银酬,entrySet()
for(Map.Entry<Student, String> me : map.entrySet()){
Student key = me.getKey();
String value = me.getValue();
System.out.println(key+"::"+value);
}
}
}