隨筆 - 71  文章 - 15  trackbacks - 0
          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          因為口渴,上帝創造了水;
          因為黑暗,上帝創造了火;
          因為我需要朋友,所以上帝讓你來到我身邊
          Click for Shaanxi xi'an, Shaanxi Forecast
          ╱◥█◣
            |田|田|
          ╬╬╬╬╬╬╬╬╬╬╬
          If only I have such a house!
          〖總在爬山 所以艱辛〗
          Email:myesjoy@yahoo.com.cn
          NickName:yesjoy
          MSN:myesjoy@hotmail.com
          QQ:150230516

          〖總在尋夢 所以苦痛〗

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          Hibernate在線

          Java友情

          Java認證

          linux經典

          OA系統

          Spring在線

          Structs在線

          專家專欄

          企業信息化

          大型設備共享系統

          工作流

          工作流產品

          網上購書

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          比較函數
          TreeSet和TreeMap都按排序順序存儲元素。然而,精確定義采用何種“排序順序”的是比較函數。通常在默認的情況下,這些類通過使用被Java稱之為“自然順序”的順序存儲它們的元素,而這種順序通常也是你所需要的(A在B的前面,1在2的前面,等等)。如果需要用不同的方法對元素進行排序,可以在構造集合或映射時,指定一個Comparator對象。這樣做為你提供了一種精確控制如何將元素儲存到排序類集和映射中的能力。
            
            Comparator接口定義了兩個方法:compare( )和equals( )。這里給出的compare( )方法按順序比較了兩個元素:
            
            int compare(Object obj1, Object obj2)
            
            obj1和obj2是被比較的兩個對象。當兩個對象相等時,該方法返回0;當obj1大于obj2時,返回一個正值;否則,返回一個負值。如果用于比較的對象的類型不兼容的話,該方法引發一個ClassCastException異常。通過覆蓋compare( ),可以改變對象排序的方式。例如,通過創建一個顛倒比較輸出的比較函數,可以實現按逆向排序。
            
            這里給出的equals( )方法,測試一個對象是否與調用比較函數相等:
            
            boolean equals(Object obj)
            
            obj是被用來進行相等測試的對象。如果obj和調用對象都是Comparator的對象并且使用相同的排序。該方法返回true.否則返回false.重載equals( )方法是沒有必要的,大多數簡單的比較函數都不這樣做。
            
            1 使用比較函數
            
            下面是一個說明定制的比較函數能力的例子。該例子實現compare( )方法以便它按正常順序的逆向進行操作。因此,它使得一個樹集合按逆向的順序進行存儲。
          // Use a custom comparator.
          import java.util.Comparator;
          //A reverse comparator for strings.
          public class MyComp implements Comparator {
              
          public int compare(Object a, Object b) {
                  String aStr, bStr;
                  aStr 
          = (String) a;
                  bStr 
          = (String) b;
                  
          // reverse the comparison
                  return bStr.compareTo(aStr);
              }

              
          // no need to override equals
          }

          import java.util.Iterator;
          import java.util.TreeSet;

          public class CompDemo {
              
          public static void main(String[] args) {
                  
          // Create a tree set
                  TreeSet ts = new TreeSet(new MyComp());
                  
          // Add elements to the tree set
                  ts.add("C");
                  ts.add(
          "A");
                  ts.add(
          "B");
                  ts.add(
          "E");
                  ts.add(
          "F");
                  ts.add(
          "D");
                  
          // Get an iterator
                  Iterator i = ts.iterator();
                  
          // Display elements
                  while (i.hasNext()) {
                      Object element 
          = i.next();
                      System.out.print(element 
          + " ");
                  }

                  System.out.println();
              }

          }


          正如下面的輸出所示,樹按照逆向順序進行存儲:
            
            F E D C B A
            
            仔細觀察實現Comparator并覆蓋compare( )方法的MyComp類(正如前面所解釋的那樣,覆蓋equals( )方法既不是必須的,也不是常用的)。在compare( )方法內部,String方法compareTo( )比較兩個字符串。然而由bStr??不是aStr??調用compareTo( )方法,這導致比較的結果被逆向。
            
            對應一個更實際的例子,下面的例子是用TreeMap程序實現前面介紹的存儲賬目資產平衡表例子的程序。在前面介紹的程序中,賬目是按名進行排序的,但程序是以按照名字進行排序開始的。下面的程序按姓對賬目進行排序。為了實現這種功能,程序使用了比較函數來比較每一個賬目下姓的排序。得到的映射是按姓進行排序的。
          //Use a comparator to sort accounts by last name.
          import java.util.Comparator;

          //Compare last whole words in two strings.
          public class TComp implements Comparator {

              
          public int compare(Object a, Object b) {
                  
          int i, j, k;
                  String aStr, bStr;
                  aStr 
          = (String) a;
                  bStr 
          = (String) b;
                  
          // find index of beginning of last name
                  i = aStr.lastIndexOf(' ');
                  j 
          = bStr.lastIndexOf(' ');
                  k 
          = aStr.substring(i).compareTo(bStr.substring(j));
                  
          if (k == 0// last names match, check entire name
                      return aStr.compareTo(bStr);
                  
          else
                      
          return k;
              }

              
          // no need to override equals
          }

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

          public class TreeMapDemo2 {
              
          public static void main(String[] args) {
                  
          // Create a tree map
                  TreeMap tm = new TreeMap(new TComp());
                  
          // Put elements to the map
                  tm.put("John Doe"new Double(3434.34));
                  tm.put(
          "Tom Smith"new Double(123.22));
                  tm.put(
          "Jane Baker"new Double(1378.00));
                  tm.put(
          "Todd Hall"new Double(99.22));
                  tm.put(
          "Ralph Smith"new Double(-19.08));
                  
          // Get a set of the entries
                  Set set = tm.entrySet();
                  
          // Get an iterator
                  Iterator itr = set.iterator();
                  
          // Display elements
                  while (itr.hasNext()) {
                      Map.Entry me 
          = (Map.Entry) itr.next();
                      System.out.print(me.getKey() 
          + "");
                      System.out.println(me.getValue());
                  }

                  System.out.println();
                  
          // Deposit 1000 into John Doe's account
                  double balance = ((Double) tm.get("John Doe")).doubleValue();
                  tm.put(
          "John Doe"new Double(balance + 1000));
                  System.out.println(
          "John Doe's new balance: " + tm.get("John Doe"));
              }

          }


            這里是程序的輸出結果,注意此時的賬目是按姓進行排序的:
            
            Jane Baker: 1378.0
            
            John Doe: 3434.34
            
            Todd Hall: 99.22
            
            Ralph Smith: -19.08
            
            Tom Smith: 123.22
            
            John Doe’s new balance: 4434.34
            
            比較函數類TComp比較兩個包含姓和名的字符串。它首先比較姓。具體是這樣做的,它首先尋找每一個字符串中最后一個空格的下標,然后比較從這個位置開始的每一個元素的子字符串。當兩個字符串中姓完全相等時,它再比較兩個名。這樣就形成了一個先按姓進行排序,在姓相同的情況下,再按名字進行排序的樹型映射。通過程序的輸出中RalphSmith出現在Tom Smith之前的結果可以看到這一點。

          參照:http://www.linuxmine.com/43849.html
          posted on 2007-06-25 10:56 ★yesjoy★ 閱讀(7918) 評論(0)  編輯  收藏 所屬分類: java.util包

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 朝阳区| 旌德县| 永康市| 石屏县| 临朐县| 廉江市| 左云县| 盘锦市| 宁波市| 班戈县| 大港区| 贞丰县| 保山市| 西平县| 沅陵县| 南陵县| 南京市| 海原县| 肇庆市| 河曲县| 三台县| 垦利县| 比如县| 东乡县| 鹤庆县| 宁都县| 陕西省| 南宫市| 湖州市| 临朐县| 城步| 玉田县| 枞阳县| 镇远县| 晋宁县| 元阳县| 大方县| 习水县| 灌阳县| 株洲市| 陆川县|