當前位置:首頁 » 操作系統 » treemap源碼

treemap源碼

發布時間: 2022-05-13 12:21:38

java TreeMap 源碼中的 buildFromSorted方法 建樹原理是什麼

你在網路搜 四湖論壇 希望對你有幫助

Ⅱ java中TreeSet,SortedMap 的底層用的排序演算法是什麼二分法快排

看了下源碼
TreeSet裡面有一個NavigableSet引用m
在調用TreeSet構造方法時 會將m引用到一個新建的TreeMap對象
TreeSet一系列的操作都是通過這個TreeMap 完成的 可以去看看TreeMap的方法
具體底層的演算法.......我也沒看懂

Ⅲ Hashtable,HashMap和TreeMap的區別

Java為數據結構中的映射定義了一個介面java.util.Map,


它有四個實現類,分別是HashMap、HashTable、LinkedHashMap和TreeMap


這里介紹這4中實例的用法和區別。


關鍵技術剖析:
Map用於存儲鍵值對,根據鍵得到值,因此不允許鍵重復,值可以重復。
l (1)HashMap是一個最常用的Map,它根據鍵的hashCode值存儲數據,根據鍵可以直接獲取它的值,具有很快的訪問速度。HashMap最多隻允許一條記錄的鍵為null,不允許多條記錄的值為null。HashMap不支持線程的同步,即任一時刻可以有多個線程同時寫HashMap,可能會導致數據的不一致。如果需要同步,可以用Collections.synchronizedMap(HashMap map)方法使HashMap具有同步的能力。


l (2)Hashtable與HashMap類似,不同的是:它不允許記錄的鍵或者值為空;它支持線程的同步,即任一時刻只有一個線程能寫Hashtable,然而,這也導致了Hashtable在寫入時會比較慢。


l (3)LinkedHashMap保存了記錄的插入順序,在用Iteraor遍歷LinkedHashMap時,先得到的記錄肯定是先插入的。在遍歷的時候會比HashMap慢。有HashMap的全部特性。
l (4)TreeMap能夠把它保存的記錄根據鍵排序,默認是按升序排序,也可以指定排序的比較器。當用Iteraor遍歷TreeMap時,得到的記錄是排過序的。TreeMap的鍵和值都不能為空。

importjava.util.HashMap;
importjava.util.Hashtable;
importjava.util.Iterator;
importjava.util.LinkedHashMap;
importjava.util.Map;
importjava.util.TreeMap;


publicclassTestMap{


publicstaticvoidinit(Mapmap){
if(map!=null){
Stringkey=null;
for(inti=5;i>0;i--){
key=newInteger(i).toString()+".0";
map.put(key,key.toString());
//Map中的鍵是不重復的,如果插入兩個鍵值一樣的記錄,
//那麼後插入的記錄會覆蓋先插入的記錄
map.put(key,key.toString()+"0");}
}
}

publicstaticvoidoutput(Mapmap){
if(map!=null){
Objectkey=null;
Objectvalue=null;
//使用迭代器遍歷Map的鍵,根據鍵取值
Iteratorit=map.keySet().iterator();
while(it.hasNext()){
key=it.next();
value=map.get(key);
System.out.println("key:"+key+";value:"+value);
}
//或者使用迭代器遍歷Map的記錄Map.Entry
Map.Entryentry=null;
it=map.entrySet().iterator();
while(it.hasNext()){
//一個Map.Entry代表一條記錄
entry=(Map.Entry)it.next();
//通過entry可以獲得記錄的鍵和值
//System.out.println("key:"+entry.getKey()+";value:"+entry.getValue());
}
}
}

(Mapmap,Objectkey){
if(map!=null){
returnmap.containsKey(key);
}
returnfalse;
}

(Mapmap,Objectvalue){
if(map!=null){
returnmap.containsValue(value);
}
returnfalse;
}

publicstaticvoidtestHashMap(){
MapmyMap=newHashMap();
init(myMap);
//HashMap的鍵可以為null
myMap.put(null,"ddd");
//HashMap的值可以為null
myMap.put("aaa",null);
output(myMap);
}

publicstaticvoidtestHashtable(){
MapmyMap=newHashtable();
init(myMap);
//Hashtable的鍵不能為null
//myMap.put(null,"ddd");
//Hashtable的值不能為null
//myMap.put("aaa",null);
output(myMap);
}

(){
MapmyMap=newLinkedHashMap();
init(myMap);
//LinkedHashMap的鍵可以為null
myMap.put(null,"ddd");
myMap.put(null,"aaa");
//LinkedHashMap的值可以為null
myMap.put("aaa",null);
output(myMap);
}

publicstaticvoidtestTreeMap(){
MapmyMap=newTreeMap();
init(myMap);
//TreeMap的鍵不能為null
//myMap.put(null,"ddd");
//TreeMap的值不能為null
//myMap.put("aaa",null);
output(myMap);
}

publicstaticvoidmain(String[]args){
System.out.println("採用HashMap");
TestMap.testHashMap();
System.out.println("採用Hashtable");
TestMap.testHashtable();
System.out.println("採用LinkedHashMap");
TestMap.testLinkedHashMap();
System.out.println("採用TreeMap");
TestMap.testTreeMap();

MapmyMap=newHashMap();
TestMap.init(myMap);
System.out.println("新初始化一個Map:myMap");
TestMap.output(myMap);
//清空Map
myMap.clear();
System.out.println("將myMapclear後,myMap空了么?"+myMap.isEmpty());
TestMap.output(myMap);
myMap.put("aaa","aaaa");
myMap.put("bbb","bbbb");
//判斷Map是否包含某鍵或者某值
System.out.println("myMap包含鍵aaa?"+TestMap.containsKey(myMap,"aaa"));
System.out.println("myMap包含值aaaa?"+TestMap.containsValue(myMap,"aaaa"));
//根據鍵刪除Map中的記錄
myMap.remove("aaa");
System.out.println("刪除鍵aaa後,myMap包含鍵aaa?"+TestMap.containsKey(myMap,"aaa"));
//獲取Map的記錄數
System.out.println("myMap包含的記錄數:"+myMap.size());
}
}



輸出結果:
採用HashMap
key: null; value: ddd
key: 3.0; value: 3.00
key: aaa; value: null
key: 4.0; value: 4.00
key: 1.0; value: 1.00
key: 5.0; value: 5.00
key: 2.0; value: 2.00
採用Hashtable
key: 4.0; value: 4.00
key: 1.0; value: 1.00
key: 3.0; value: 3.00
key: 5.0; value: 5.00
key: 2.0; value: 2.00
採用LinkedHashMap
key: 5.0; value: 5.00
key: 4.0; value: 4.00
key: 3.0; value: 3.00
key: 2.0; value: 2.00
key: 1.0; value: 1.00
key: null; value: aaa
key: aaa; value: null
採用TreeMap
key: 1.0; value: 1.00
key: 2.0; value: 2.00
key: 3.0; value: 3.00
key: 4.0; value: 4.00
key: 5.0; value: 5.00
新初始化一個Map: myMap
key: 3.0; value: 3.00
key: 4.0; value: 4.00
key: 1.0; value: 1.00
key: 5.0; value: 5.00
key: 2.0; value: 2.00
將myMap clear後,myMap空了么? true
myMap包含鍵aaa? true
myMap包含值aaaa? true
刪除鍵aaa後,myMap包含鍵aaa? false
myMap包含的記錄數: 1

源碼分析:
遍歷Map有兩種方法:
(1)map的keySet()方法獲得鍵的集合,再調用鍵集合的iterator方法獲得鍵的迭代器,以此迭代地取出Map中的鍵,用get方法獲得鍵對應的值,便完成了Map的遍歷。代碼如下所示:
//使用迭代器遍歷Map的鍵,根據鍵取值
Iterator it = map.keySet().iterator();
while (it.hasNext()){
key = it.next();
value = map.get(key);
System.out.println("key: " + key + "; value: " + value );
}
(2)使用Map的entrySet方法獲得Map中記錄的集合,每條對象都是一個Map.Entry對象,使用其getKey方法獲得記錄的鍵,使用其getValue方法獲得記錄的值。代碼如下所示:
//或者使用迭代器遍歷Map的記錄Map.Entry
Map.Entry entry = null;
it = map.entrySet().iterator();
while (it.hasNext()){
//一個Map.Entry代表一條記錄
entry = (Map.Entry)it.next();
//通過entry可以獲得記錄的鍵和值
//System.out.println("key: " + entry.getKey() + "; value: " + entry.getValue());

Ⅳ Java中HashMap和TreeMap的區別深入理解

HashMap通過hashcode對其內容進行快速查找,而 TreeMap中所有的元素都保持著某種固定的順序,如果你需要得到一個有序的結果你就應該使用TreeMap(HashMap中元素的排列順序是不固定的)。
HashMap 非線程安全 TreeMap 非線程安全

線程安全
在Java里,線程安全一般體現在兩個方面:
1、多個thread對同一個java實例的訪問(read和modify)不會相互干擾,它主要體現在關鍵字synchronized。如ArrayList和Vector,HashMap和Hashtable
(後者每個方法前都有synchronized關鍵字)。如果你在interator一個List對象時,其它線程remove一個element,問題就出現了。

2、每個線程都有自己的欄位,而不會在多個線程之間共享。它主要體現在java.lang.ThreadLocal類,而沒有Java關鍵字支持,如像static、transient那樣。
1.AbstractMap抽象類和SortedMap介面
AbstractMap抽象類:(HashMap繼承AbstractMap)覆蓋了equals()和hashCode()方法以確保兩個相等映射返回相同的哈希碼。如果兩個映射大小相等、包含同樣的鍵且每個鍵在這兩個映射中對應的值都相同,則這兩個映射相等。映射的哈希碼是映射元素哈希碼的總和,其中每個元素是Map.Entry介面的一個實現。因此,不論映射內部順序如何,兩個相等映射會報告相同的哈希碼。
SortedMap介面:(TreeMap繼承自SortedMap)它用來保持鍵的有序順序。SortedMap介面為映像的視圖(子集),包括兩個端點提供了訪問方法。除了排序是作用於映射的鍵以外,處理SortedMap和處理SortedSet一樣。添加到SortedMap實現類的元素必須實現Comparable介面,否則您必須給它的構造函數提供一個Comparator介面的實現。TreeMap類是它的唯一一份實現。

2.兩種常規Map實現
HashMap:基於哈希表實現。使用HashMap要求添加的鍵類明確定義了hashCode()和equals()[可以重寫hashCode()和equals()],為了優化HashMap空間的使用,您可以調優初始容量和負載因子。
(1)HashMap(): 構建一個空的哈希映像
(2)HashMap(Map m): 構建一個哈希映像,並且添加映像m的所有映射
(3)HashMap(int initialCapacity): 構建一個擁有特定容量的空的哈希映像
(4)HashMap(int initialCapacity, float loadFactor): 構建一個擁有特定容量和載入因子的空的哈希映像
TreeMap:基於紅黑樹實現。TreeMap沒有調優選項,因為該樹總處於平衡狀態。
(1)TreeMap():構建一個空的映像樹
(2)TreeMap(Map m): 構建一個映像樹,並且添加映像m中所有元素
(3)TreeMap(Comparator c): 構建一個映像樹,並且使用特定的比較器對關鍵字進行排序
(4)TreeMap(SortedMap s): 構建一個映像樹,添加映像樹s中所有映射,並且使用與有序映像s相同的比較器排序

3.兩種常規Map性能
HashMap:適用於在Map中插入、刪除和定位元素。
Treemap:適用於按自然順序或自定義順序遍歷鍵(key)。

4.總結
HashMap通常比TreeMap快一點(樹和哈希表的數據結構使然),建議多使用HashMap,在需要排序的Map時候才用TreeMap。

Ⅳ 如何遍歷有序的TreeMap-CSDN論壇

你想按照map的value進行排序,首先你的compare介面就是個錯誤的實現,一般會實現2個if分支,就是比較的值要求是返回3種情況-1,0,1。為啥要這樣?如果你不這樣做會產生很多bug,你去看看treemap的源碼,在使用你自己實現的comparator借口進行比較的時候有while(p!=null){intcmp=cpr.compare(k,p.key);if(cmp0)p=p.right;elsereturnp;}但是你自己實現的介面沒有else那種情況,就是cmp=0那種情況,所以永遠得不到key對應的value了。你的問題有兩種方法解決在你的comapre方法改為publicintcompare(Stringa,Stringb){if(base.get(a)>base.get(b)){return-1;}elseif(base.get(a)>set=sorted_map.entrySet();for(Entryi:set){System.out.println(i.getValue());}

Ⅵ 在TreeMap treemap類聲明時遇到的疑惑, 源代碼:

TreeMap中插入數據是需要(鍵,值)對的,作為一種靠紅黑樹實現的高效查找結構,對插入的數據必須有方法能按鍵進行大小比較,因此必須提供對鍵的比較方法,但這不是必須的,因為內置對象和結構有些實現了比較方法,例如:鍵是int時就不需要了,但是當鍵是自定義類時,就必須實現這個比較器

Ⅶ map是以什麼方式存儲鍵值對的

Map是一種把鍵對象和值對象進行關聯的容器,而一個值對象又可以是一個Map,依次類推,這樣就可形成一個多級映射。對於鍵對象來說,像Set一樣,一個Map容器中的鍵對象不允許重復,這是為了保持查找結果的一致性;如果有兩個鍵對象一樣,那你想得到那個鍵對象所對應的值對象時就有問題了,可能你得到的並不是你想的那個值對象,結果會造成混亂,所以鍵的唯一性很重要,也是符合集合的性質的。當然在使用過程中,某個鍵所對應的值對象可能會發生變化,這時會按照最後一次修改的值對象與鍵對應。對於值對象則沒有唯一性的要求。你可以將任意多個鍵都映射到一個值對象上,這不會發生任何問題(不過對你的使用卻可能會造成不便,你不知道你得到的到底是那一個鍵所對應的值對象)。Map有兩種比較常用的實現:HashMap和TreeMap。HashMap也用到了哈希碼的演算法,以便快速查找一個鍵,TreeMap則是對鍵按序存放,因此它便有一些擴展的方法,比如firstKey(),lastKey()等,你還可以從TreeMap中指定一個范圍以取得其子Map。鍵和值的關聯很簡單,用pub(Object key,Object value)方法即可將一個鍵與一個值對象相關聯。用get(Object key)可得到與此key對象所對應的值對象。

Ⅷ java treeMap 排序後 get不到value

你想按照map的value進行排序,首先你的compare介面就是個錯誤的實現,一般會實現2個if分支,就是比較的值要求是返回3種情況-1,0,1。為啥要這樣?如果你不這樣做會產生很多bug,你去看看treemap的源碼,在使用你自己實現的comparator借口進行比較的時候有

while(p!=null){
intcmp=cpr.compare(k,p.key);
if(cmp<0)
p=p.left;
elseif(cmp>0)
p=p.right;
else
returnp;
}

但是你自己實現的介面沒有else那種情況,就是cmp=0那種情況,所以永遠得不到key對應的value了。


你的問題有兩種方法解決在你的comapre方法改為

publicintcompare(Stringa,Stringb){
if(base.get(a)>base.get(b)){
return-1;
}elseif(base.get(a)<base.get(b)){
return1;
}else{
return0;
}
}

或者你取value的時候不通過get方法,而是通過

Set<Entry<String,Double>>set=sorted_map.entrySet();
for(Entry<String,Double>i:set){
System.out.println(i.getValue());
}

Ⅸ java程序:統計單詞詞頻,

不多說,先看代碼:

import java.util.*;
import java.io.*;
public class wordsRate {
public static void main(String[] args) throws Exception {

BufferedReader infile = new BufferedReader(new FileReader("article.txt"));
String string;
String file = null;
while ((string = infile.readLine()) != null) {
file += string;
}
file = file.toLowerCase();
file = file.replaceAll("[^A-Za-z]", " ");
file = file.replaceAll("\\s+", " ");
String words[];
words = file.split("\\s+");
Map<String, Integer> hashMap = new HashMap<String, Integer>();
for (int i = 0; i < words.length; i++) {
String key = words[i];
if (hashMap.get(key) != null) {
int value = ((Integer) hashMap.get(key)).intValue();
value++;
hashMap.put(key, new Integer(value));
} else {
hashMap.put(key, new Integer(1));
}
}
Map<String, Object> treeMap = new TreeMap<String, Object>(hashMap);
Map<String, Object> treeMap1 = new TreeMap<String, Object>(hashMap);
BufferedWriter bw = new BufferedWriter(new FileWriter("result.txt"));

//下面是我改動的你的代碼:

Iterator iter = treeMap.entrySet().iterator();
//定義兩個新的數組ss1和ss2,數組長度就是hashMap的長度,裡面放分別是hashMap的value和key
String ss1[]=new String[treeMap.size()];;
int ss2[]=new int[treeMap.size()];
int i=0;
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
int val = (Integer)entry.getValue();
String key =(String) entry.getKey();
ss1[i]=key;
ss2[i]=val;
i++;
}
//下面將ss1數組進行排序,並將其與ss2數組的內容相對應起來
int sValue=0;
String sKey="";
for(int j=0;j<ss2.length;j++){
for(int k=0;k<i;k++){
if(ss2[j]>ss2[k]){
sValue=ss2[j];
sKey=ss1[j];
ss2[j]=ss2[k];
ss1[j]=ss1[k];
ss2[k]=sValue;
ss1[k]=sKey;
}
}
}
for(int j=0;j<ss2.length;j++){
System.out.println(ss1[j]+"="+ss2[j]);
bw.write(ss1[j]+"="+ss2[j]);
bw.newLine();
bw.flush();
}
}
}

代碼是本人自己寫的,也經過了自己的驗證,肯定沒問題,希望採納。
功能實現了,我是將其key和value值放在了數組之中,然後進行排序,將其輸出到了txt文件里
排序方式不一樣,實現的方式也不一樣,所謂仁者見仁智者見智。

Ⅹ java 的TreeMap是怎麼存放和讀取的借著下面的程序幫我解釋一下,謝謝

前面的A,B,C...是KEY,後面的1,2,3是value, 需要從treemap里取值的話就只需要treemap.get("A");或者其他就可以

System.out.print(treemap); 這個語句調用了treemap的toString方法,是用前面KEY的升序排列

熱點內容
android鎖屏廣播 發布:2024-10-10 03:21:41 瀏覽:579
上傳說的薩滿卡組 發布:2024-10-10 03:21:35 瀏覽:18
優酷視頻緩存文件 發布:2024-10-10 03:20:54 瀏覽:658
sqlutc時間 發布:2024-10-10 03:19:40 瀏覽:256
陰陽師舉報腳本 發布:2024-10-10 03:18:54 瀏覽:745
蘋果4s手機忘記id密碼怎麼辦 發布:2024-10-10 03:15:59 瀏覽:119
有哪些配置高的小型車 發布:2024-10-10 03:14:53 瀏覽:757
在網上買電腦怎麼選擇配置 發布:2024-10-10 02:46:45 瀏覽:339
控制邏輯演算法 發布:2024-10-10 02:32:22 瀏覽:756
蘭州達內java培訓 發布:2024-10-10 02:31:48 瀏覽:327