2008年11月12日

HashMap的應用及資料排序


 
在資料處理時我們常常需要 (key, value) 的對應
先前在將List做排序的方法也是為了類似的目的
當初利用List是因為我們不需要由key去取得value的功能
只需要把所有資料依某個欄位排序全部印出即可
在這種情況底下自己建立所需資料型態的物件List會比較方便

然而有時候我們需要的是針對某個鍵值提出對應的資料
以成績單舉例好了 當我們的目的只是要列印成績單
那麼用List去做會是一個不錯的選擇
可是在List的結構底下若是我們只想得到某一學生的成績
那我們就得在List裡頭搜尋這個學生的名字然後才能得到成績
面對這種狀況另一個方法就是利用HashMap

把資料的 (key, value) 放入HashMap以後要針對特定的key取得value是非常簡單的
可以參考最下面程式碼裡面單純取得成績那段
如果HashMap裡頭有儲存資料則會傳回對應該key的value
HashMap裡沒有資料的話則會傳回 null

在HashMap裡資料的排列與key、value、加入順序都無關
HashMap有自己獨特的排列方式,像程式碼第二段的輸出結果
若是想讓資料以key值排序可以選擇用TreeMap 但效能是HashMap較佳

利用HashMap我們已經達到可以利用key值迅速取得value
但是如果我們想要印出所有資料卻又不知道姓名怎麼辦呢?
這時候只好利用HashMap的entrySet()方法取得所有資料
然後把這些資料匯入List中做處理
只要資料匯入List後就可以依照key或value排序印出了
如程式碼第三四段

在看程式碼和結果前先下個簡短的結論
如果是單純的想列印全部資料或者欄位不只兩個
那麼就建立一個自訂class的List來處理會比較方便
如同將List做排序的方法所介紹的
但如果資料只是兩欄 (key, value) 的配對
則用HashMap可以迅速取得單一key對應的資料
HashMap的作法只要稍加轉換仍舊可以排序列印出所有資料
以上供大家在選擇時做參考,下面是程式碼和輸出結果
  1. import java.util.*;

  2. public class HashMapDemo {

  3. private HashMap<String, Integer> transcript;

  4. public static void main(String[] args) {
  5. new HashMapDemo();
  6. }

  7. public HashMapDemo() {

  8. transcript = new HashMap<String, Integer>();
  9. transcript.put("Alex", 95);
  10. transcript.put("Bibby", 70);
  11. transcript.put("Charlie", 85);
  12. transcript.put("David", 75);

  13. // 單純取出學生的成績
  14. printGrade("Alex");
  15. printGrade("Bibby");
  16. printGrade("Joice"); //沒資料會傳回null
  17. System.out.println();

  18. // 想印出HashMap裡的全部資料
  19. // 注意這裡印出的順序不按姓名、成績,也不按加入順序
  20. // 因為HashMap有自己的排序方式,若要按姓名排序可用TreeMap但效能較差
  21. for (String name:transcript.keySet()) {
  22. printGrade(name);
  23. }
  24. System.out.println();

  25. // 想依照姓名或成績牌列印出所有資料,先將所有HashMap裡的entry放入List
  26. List<Map.Entry<String, Integer>> list_Data =
  27. new ArrayList<Map.Entry<String, Integer>>(transcript.entrySet());

  28. // 依姓名排序並列印
  29. Collections.sort(list_Data, new Comparator<Map.Entry<String, Integer>>(){
  30. public int compare(Map.Entry<String, Integer> entry1,
  31. Map.Entry<String, Integer> entry2){
  32. return (entry1.getKey().compareTo(entry2.getKey()));
  33. }
  34. });
  35. for (Map.Entry<String, Integer> entry:list_Data) {
  36. printGrade(entry.getKey());
  37. }
  38. System.out.println();

  39. // 依成績排序並列印
  40. Collections.sort(list_Data, new Comparator<Map.Entry<String, Integer>>(){
  41. public int compare(Map.Entry<String, Integer> entry1,
  42. Map.Entry<String, Integer> entry2){
  43. return (entry2.getValue() - entry1.getValue());
  44. }
  45. });
  46. for (Map.Entry<String, Integer> entry:list_Data) {
  47. printGrade(entry.getKey());
  48. }
  49. }

  50. private void printGrade(String name) {
  51. System.out.println(name + "\t" + transcript.get(name));
  52. }
  53. }
輸出結果:
  1. Alex 95
  2. Bibby 70
  3. Joice null

  4. Charlie 85
  5. Bibby 70
  6. David 75
  7. Alex 95

  8. Alex 95
  9. Bibby 70
  10. Charlie 85
  11. David 75

  12. Alex 95
  13. Charlie 85
  14. David 75
  15. Bibby 70

關鍵字:HashMap, Map, Key, Value, Collections, sort, 排序

參考資料:
1. 針對java.util.Map的Value做排序(1)
2. 將List做排序的方法


更多精選推薦文章

0 意見 :