黑馬程序員_java_集合_Map_Collections_Arrays_TreeMap

  ------- android培訓java培訓、期待與您交流! ----------



一、Map


1、Map :該集合存儲鍵值對。一對一對往裏存,而且要保證鍵的唯一性。        和set很像。其實set底層就是使用了Map集合
|--Hashtable:底層是哈希表數據結構。不可以存入null鍵和null值。該集合是線程同步的。jdk1.0發佈。效率低。


|--HashMap:底層是哈希表數據結構。可以存入null鍵和null值。該集合是線程不同步的。jdk1.2發佈。效率高


|--TreeMap:底層是二叉樹結構,線程不同步。可以用於給map集合中的鍵進行排序


2、Map的基本使用代碼
import java.util.Map;
import java.util.HashMap;


class MapDemo 
{
	public static void main(String[] args) 
	{
		//創建一個容器
		Map<String, String> map = new HashMap<String, String>();


		//添加元素
		map.put("01", "zhangsan");
		map.put("02", "zhangsi");
		map.put("03", "zhangwu");


		//判斷元素是否存在
		System.out.println("containsKey:" + map.containsKey("02"));


		//刪除一個元素
		System.out.println("remove:" + map.remove("02"));


		//獲取一個元素
		System.out.println("get:" + map.get("03"));


		//獲取全部元素
		System.out.println("value:" + map.values());
	}
}



3。Map集合中兩種取出元素的方式




Map集合的兩種取出方式:
1,keySet,將map中所有的鍵存入到Set集合,因爲set具備迭代器。
所有的迭代方式取出素偶的鍵,在根據get方法,獲取每一個鍵對應的值。
在通過Set集合的迭代器取出Set集合中的鍵。
通過map的get(取得鍵值的變量)方法獲取鍵對應的值。


第二種取出元素的方法
2.Set<Map.Entry<k,v>> endtryset; 將Map集合中的影射關係。存入到了set集合中。
而這個關係的數據類型就是Map.Entry
取出原理:就是取出map集合中的映射關係取出。這個關係就是Map.Entry; 關係對象Map.Entry獲取到後,就可以通過Map.Entry
中的getKey和getValue方法獲取關係中的鍵和值。


3.Map.Entry其實Entry也是一個接口。它是Map接口中的一個內部接口


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


class MapKeySet 
{
	public static void main(String[] args) 
	{
		//quChu_1();
		quChu_2();
	}


	//集合的第一種取出元素方法
	public static void quChu_1()
	{
		//定義一個Map集合的容器
		Map<String, String> map = new HashMap<String, String>();
		map.put("01", "zhangsan");
		map.put("02", "zhangsi"); //添加元素
		map.put("03", "zhangwu");
		Set<String> keyset = map.keySet(); //調用keySet方法。返回一個Set類型的集合
		Iterator<String> it = keyset.iterator(); //創建一個迭代器
		for( ; it.hasNext(); ) //判斷。只要有數據就一直運行
		{
			String s = it.next(); //把取出的鍵值賦值給變量s;
			String s1 = map.get(s); //用鍵值通過get方法獲取鍵值對應的名稱
			System.out.println(s + "     " + s1);
		}
	}


	//取出元素的第二種方式
	public static void quChu_2()
	{
		//定義一個Map集合的容器
		Map<String, String> map = new HashMap<String, String>();
		map.put("01", "zhangsan");
		map.put("02", "zhangsi"); //添加元素
		map.put("03", "zhangwu");
		Set<Map.Entry<String, String>> entryset = map.entrySet(); //調用entrySet方法返回一個Map.Entry的映射關係
		Iterator<Map.Entry<String, String>> it = entryset.iterator(); //獲取迭代器
		for( ; it.hasNext(); ) //判斷集合中是否有元素
		{
			Map.Entry<String, String> ms = it.next(); //把關係對象賦值給Map.Entry集合的對象
			String s1 = ms.getKey(); //獲取鍵值
			String s2 = ms.getValue(); //獲取與鍵值對應的值
			System.out.println(s1 + "      " + s2);
		}
	}
}




二、TreeMap的一個小應用與習題示例


/*
練習:
“sdfgzxcvasdfxcvdf"獲取該字符串中的字母出現的次數。


希望打印結果:a(1)c(2).....


通過結果發現,每一個字母都有對應的次數。
說明字母和次數之間都有映射關係。


注意了,當發現有映射關係時,可以選擇Map集合。
因爲Map集合中存放就是映射關係。


什麼時候使用Map集合呢?
當數據之間存在映射關係時,就要先想Map集合。
思路:
1、將字符串轉換成字符數組,因爲要對每一個字母進行操作。


2、定義一個Map集合,因爲打印結果的字母有順序,所以使用TreeMap集合。


3、遍歷字符數組。
將每一個字母作爲鍵去查Map集合。
如果返回null,將該字母和1存入到Map集合中。
如果返回不是null,說明該字母在Map集合中已經存在並有對應次數。
那麼就獲取該粗疏並進行自增。然後將該字母和自增後的次數存入到Map集合中,覆蓋調用原理鍵所對應的值。


4、將Map集合中的數據變成指定的字符串形式返回。
*/
import java.util.TreeMap;
import java.util.Set;
import java.util.Iterator;
import java.util.Map;


class MapTest3 
{
	public static void main(String[] args) 
	{
		String s = "s+fg_zx_cv*asdfxcvdf";
		System.out.println(charString(s));
	}


	//定義一個可以查詢字符串出現次數的函數
	public static String charString(String str)
	{
		char[] chs = str.toCharArray(); //將字符串轉換成字符數組
		//創建集合
		TreeMap<Character, Integer> tm = new TreeMap<Character, Integer>();
		for(int i = 0; i < chs.length; i++)
		{
			Integer value = tm.get(chs[i]);
			//假如不是字母就退出本次循環
			if(!(chs[i] >= 'a' && chs[i] <= 'z' || chs[i] >= 'A' && chs[i] <= 'Z'))
				continue;
			if(value == null)
			{
				tm.put(chs[i], 1); //如果集合中沒有該元素。就把該元素和1放進集合中。
			} 
			else
			{
				value = value + 1; //假如不爲空,就讓變量自增
				tm.put(chs[i], value); //然後把鍵和自增後的變量存入集合中。
			}
		}
		//建立一個容器
		StringBuffer sb = new StringBuffer();
		Set<Map.Entry<Character, Integer>> entry = tm.entrySet(); //把元素存入到Set集合中
		Iterator<Map.Entry<Character, Integer>> it = entry.iterator(); //建立迭代器
		for( ; it.hasNext(); ) //遍歷元素
		{
			Map.Entry<Character, Integer>  mec = it.next(); //把元素添加進Map.Entry中
			Character c = mec.getKey(); //將鍵存入變量c中
			Integer in = mec.getValue(); //將值存入變量in中
			sb.append(c + "(" + in + ")"); //將鍵和值存入容器中。
		}
		return sb.toString();
	}


}



三、Collections工具類
1、Collections工具類的應用一
/*
Collections的幾個基本應用
Collections.sort();  //對集合進行排序
Collections.brinarySearch() //對集合中的數據進行查找
Collections.max() //查找集合中的最大值
*/


import java.util.Collections;
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Comparator;


class CollectionsDemo 
{
	public static void main(String[] args) 
	{
		listSort();
	}


	public static void listSort()
	{
		List<String> al = new ArrayList<String>(); //創建一個集合
		al.add("abcd");
		al.add("a"); //添加元素
		al.add("abc");
		al.add("efang");
		al.add("ge");
		Iterator<String> it = al.iterator(); //定義一個迭代器
		String max = Collections.max(al, new Comp());
		System.out.println("max = " + max);
		for( ; it.hasNext(); ) //判斷是否有元素
		{
			Collections.sort(al, new Comp()); //調用工具類中的sort方法。並把一個比較器但成實參傳遞給sort方法
			System.out.println(it.next()); 
		}
		//查找某個元素所在的具體位置
		//int index = Collections.binarySearch(al, "a", new Comp());
		//System.out.println(index);
		//調用自定義查找方法
		int index1 = binarySearchDemo(al, "ge", new Comp());
		System.out.println(index1);
	}


	public static int binarySearchDemo(List<String> ls, String key, Comparator<String> comp) //傳入容器和具體要查的元素和比較器
	{
		int max, min, mid; //定義三個變量分別代表最大、最小、中間
		max = ls.size() - 1; //計算最後一個角標的位置
		min = 0; //確定最小角標的位置
		while(max >= min)
		{
			mid = (max + min) >> 1; //計算中間角標的位置。   >>1 相當於/(除)2;
			String str = ls.get(mid); //獲取中間角標位置上的元素
			int num = comp.compare(str, key); //判斷輸入的元素和中間角標位置的數是否相同
			if(num > 0) //假如num大於0,說明str大於key的值
				max = mid - 1;
			else if(num < 0) //假如num小於0,說明str小於key的值
				min = mid + 1;
			else //反之就說明元素找到了
				return mid;
		}
		return -min-1; //如果沒有就返回要插入的位置減一
	}


}




//新建一個比較器,實現Comparator接口。重寫compare方法
class Comp implements Comparator<String>
{
	public int compare(String s1, String s2)
	{
		if(s1.length() > s2.length())
			return 1;
		if(s1.length() < s2.length())
			return -1;
		return s1.compareTo(s2);
	}
}

2、Collections工具類的應用二


/*
Collections.fill(List<? super T> list, T obj); //把集合中的所有元素全部替換成某個元素
Collections.replaceAll(List<T> list, T oldVal, T newVal); //把集合中某個舊的元素替換成新的元素。
Collections.reverse(List<?> list); //將集合元素反轉
*/
import java.util.Collections;
import java.util.ArrayList;


class CollectionsDemo1 
{
	public static void main(String[] args) 
	{
		lian();
	}


	public static void lian()
	{
		ArrayList<String> al = new ArrayList<String>();
		al.add("adaf");
		al.add("aaa");
		al.add("bad");
		al.add("bacsxd");
		al.add("adr");
		p("原來元素:" + al);


		//Collections.fill(al, "pp");//把集合中的所有元素全部替換成某個元素
		//p("替換後元素:" + al);


		//Collections.replaceAll(al, "aaa", "zhangdongdong"); //把集合中某個舊的元素替換成新的元素。
		//p("替換後元素:" + al);


		Collections.reverse(al); //將集合元素反轉
		p("反轉後的元素:" + al);


	}


	public static void p(Object obj)
	{
		System.out.println(obj);
	}


}


3、Collections工具類的應用三


/*
Collections.reverseOrder(); 返回一個比較器,它強行逆轉實現了 Comparable 接口的對象 collection 的自然順序。
*/
import java.util.TreeSet;
import java.util.Iterator;
import java.util.Collections;
import java.util.Comparator;


class CollectionsDemo3 
{
	public static void main(String[] args) 
	{
		ni();
	}


	//寫一個程序逆轉的例子
	public static void ni()
	{
		//把CompCom的對象當成實參傳遞給Collections.reverseOrder()方法。
		TreeSet<String> al = new TreeSet<String>(Collections.reverseOrder(new CompCon()));
		al.add("adaf"); //添加元素
		al.add("adadf");
		al.add("adzvafd");
		al.add("favdsf");
		al.add("favfssdd");
		Iterator<String> it = al.iterator(); //定義迭代器
		for( ; it.hasNext(); ) //遍歷函數
		{
			String s = it.next(); //把元素賦值給變量s
			System.out.println(s);
		}
	}


}

四、集合和數組

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


class ArraysDemo 
{
	public static void main(String[] args) 
	{
		//array();
		arrayList();
	}


	
	Arrays.asList(類型)把數組變成集合
	把數組變成List集合有什麼好處?
	可以使用集合的思想和方法類操作數組中的元素。
	注意:
	將數組變成集合,不可以使用集合的增刪方法。
	因爲數組的長度是固定的。
	如果你增刪,那麼會發生UnsuppertedOperationException


	如果數組中的元素都是對象,那麼變成集合時,數組中的元素就直接變成集合中的元素。
	如果數組中的元素都是基本數據類型,那麼會將該數組作爲集合中的元素存在。


	public static void array()
	{
		int[] i = {1, 3, 5};
		List<int[]> li = Arrays.asList(i);
		System.out.println(li); //打印結果爲[[I@bdb503] 。因爲是整數數組。所以把數組當成元素存入到集合中了
		Integer[] in = {1, 3, 5}; 
		List<Integer> lin = Arrays.asList(in);
		System.out.println(lin); //打印結果爲 {1, 3, 5};因爲Integer是基本數據類。所以它定義的數組中的元素都是對象。所以集合可以存入數據。因		爲集合中的數據都是對象
		String[] s = {"abd", "dbc", "ade"};
		List<String> ls = Arrays.asList(s);
		System.out.println(ls); //打印結果爲[abd, dbc, ade] 原因和Integer類一樣。
	}


	/*
	集合變數組。
	Collection接口中的toArray方法。


	1.指定類型的數組到底要定義多長呢?
	當指定類型數組長度小於了集合的seze,那麼該方法內部會創建一個新的數組,長隊爲集合的size
	當指定類型的數組長度大於了集合的size,就不會新創建數組,二十使用傳遞類進來的數組。


	2,爲什麼要將集合變成數組?
	爲了限定對元素的操作。不需要對集合進行增刪了。
	*/
	public static void arrayList()
	{
		//定義集合
		ArrayList<String> al = new ArrayList<String>();
		al.add("adfd");
		al.add("adf"); //添加元素
		al.add("df");
		String[] str = al.toArray(new String[al.size()]); //使用toArray()方法把集合變成數組
		System.out.println(Arrays.toString(str)); //打印數組中的字符串形式
	}


}


五、高級for循環


/*
高級for循環。
格式
for(數據類型 變量名 : 被遍歷的集合(Collection)或者數組{}


對集合進行遍歷。
只能獲取集合元素。但是不能對集合進行操作。


迭代器除了遍歷。還可以進行remove在集合中的操作。
如果是用ListIteartor,還可以在遍歷過程中看集合進行增刪改查的動作。


傳統for和高級for有什麼區別?
高級for循環有一個侷限性,必須要有要被遍歷的目標
*/
import java.util.HashMap;
import java.util.Map;


class ForEach 
{
	public static void main(String[] args) 
	{
		eachFor();
	}


	//寫一個增強for循環的函數
	public static void eachFor()
	{
		//建一個HashMap集合
		HashMap<Integer, String> hm = new HashMap<Integer, String>();
		hm.put(1, "aaa");
		hm.put(2, "bbb");
		hm.put(3, "ccc");
		for(Map.Entry<Integer, String> me : hm.entrySet())
		{
			System.out.println(me.getKey() + "    " + me.getValue());
		}
	}


}


六、可變參數


/*
JDK1.5版本出現的新特性。
方法的可變參數。
在使用時注意:可變參數一定要定義在參數列表最後面。


可變參數:
其實就是參數數組的一種簡寫形式。
不用每一次都手動的建立數組對象。
只要將要操作的元素作爲參數傳遞即可。
隱式將這些參數封裝成了數組。
*/


class KeBianCan 
{
	public static void main(String[] args) 
	{
		int[] arr = {1, 4, 6, 7, 3};
		show(arr);
	}
	
	//定義一個可變參數的示例
	public static void show(int... in) //其實int... in可以理解成int[] in.因爲這個參數對數組的封裝是隱式的。也是數組參數的簡寫模式
	{
		for(int i = 0; i < in.length; i++)
		{
			System.out.println(in[i]);
		}
	}


}


七、靜態導入


靜態導入。
當類名重名時,需要指定具體的包名。
如:
packa/Demo.class
packb/Demo.class


import packa.*;
import packb.*;  
如果遇到這種情況不標明類所屬的包是無法準確找到類的。也就是會報錯。


當方法名重名時,指定所屬的對象或者類。
如:
import static java.util.Arrays.*; //導入所有類中的靜態方法
 //這裏必須加上類名。因爲本類中本身就已經繼承了Object。而Object類中就有toString()方法
 //如果不標明toString屬於哪個類。就會報錯
System.out.println(Arrays.ToString());





---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Unity開發</a>、<a href="http://edu.csdn.net"target="blank">.Net培訓</a>、期待與您交流! ----------------------


詳細請查看:<a href="http://edu.csdn.net" target="blank">http://edu.csdn.net</a>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章