国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

J2SE綜合:對java.util的總結 五

2019-11-18 11:54:20
字體:
來源:轉載
供稿:網友

  15.7 比較函數
  
  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( )方法是沒有必要的,大多數簡單的比較函數都不這樣做。
  
  15.7.1 使用比較函數
  
  下面是一個說明定制的比較函數能力的例子。該例子實現compare( )方法以便它按正常順序的逆向進行操作。因此,它使得一個樹集合按逆向的順序進行存儲。
  
  // Use a custom comparator.
  
  import java.util.*;
  
  // A reverse comparator for strings.
  
  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
  
  }
  
  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.*;
  
  // Compare last whole Words in two strings.
  
  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
  
  }
  
  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之前的結果可以看到這一點。
  
  15.8 類集算法
  
  類集框架定義了幾種能用于類集和映射的算法。在Collections類中,這些算法被定義為靜態方法。表15-9中列出了這些算法。當試圖比較不兼容的類型時,其中的一些算法引發一個ClassCastException 異常; 而當試圖改變一個不可改變的類集時, 則引發一個UnsupportedOperationException異常。
  
  表15-9 由Collections 定義的算法
  
  方法描述
  
  static int binarySearch(List list, Objectvalue,Comparator c)按照c的次序在list中搜尋value.假如value在list內,則返回value在list的位置。假如在list中沒有發現value,則返回-1
  
  static int binarySearch(List list, Object value) 在list中搜尋value,列表(list)必須被排序。假如value在list內,則返回value的位置。假如在list中沒有發現value,則返回-1
  
  static void copy(List list1, List list2) 將list2中的元素復制給list1
  
  續表
  
  方法描述
  
  static Enumeration enumeration(Collection c) 返回c的一個枚舉(參看本章后面的“枚舉接口”)。
  
  static void fill(List list, Object obj) 將obj賦給list中的每一個元素
  
  Static Object max(Collection c,Comparator comp) 返回由comp確定的c中的最大元素
  
  static Object max(Collection c) 返回按自然順序確定的c中的最大元素。類集不必被排序
  
  static Object min(Collection c,Comparator comp) 返回由comp確定的c中的最小元素。類集不必被排序
  
  static Object min(Collection c) 返回按自然順序確定的c中的最小元素
  
  static List nCopies(int num, Object obj) 返回包含在不可改變的列表中的obj的num個拷貝。
  
  num必須大于等于0
  
  static void reverse(List list) 將list中的序列逆向
  
  static Comparator reverSEOrder( ) 返回一個逆向比較函數(即將兩個元素比較的結果進行逆向的比較函數)
  
  static void shuffle(List list, Random r) 用r作為隨機數的源,對list中的元素進行混淆(也即隨機化)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 永胜县| 曲阜市| 四子王旗| 花垣县| 秀山| 万全县| 岫岩| 宁河县| 砚山县| 绥中县| 永年县| 英山县| 乌苏市| 玉田县| 竹北市| 堆龙德庆县| 永仁县| 开原市| 金塔县| 斗六市| 夏河县| 于田县| 乃东县| 汕头市| 兖州市| 元江| 勐海县| 交口县| 当雄县| 余江县| 佛坪县| 阿荣旗| 宜都市| 贵阳市| 石景山区| 女性| 石景山区| 香格里拉县| 乌什县| 兰考县| 德惠市|