熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java編程技巧:列表排序代碼分析

2013-11-23 18:58:38  來源: Java核心技術 

  在Java Collection Framework中定義的List實現有VectorArrayList和LinkedList這些集合提供了對對象組的索引訪問他們提供了元素的添加與刪除支持然而它們並沒有內置的元素排序支持
  
  你能夠使用javautilCollections類中的sort()方法對List元素進行排序你既可以給方法傳遞一個List對象也可以傳遞一個List和一個Comparator如果列表中的元素全都是相同類型的類並且這個類實現了Comparable接口你可以簡單的調用Collectionssort()如果這個類沒有實現Comparator你也可以傳遞一個Comparator到方法sort()中進行排序如果你不想使用缺省的分類順序進行排序你同樣可以傳遞一個Comparator到方法sort()中來進行排序如果列表中的元素並不都是相同類型的類你在進行排序的時候就不是這樣幸運了除非你編寫一個專用的跨類的Comparator
  
  排序的順序怎麼樣呢?如果元素是String對象卻省的排序順序是按照字符編碼進行的基本上是每個字符的ASCII/Unicode值如果嚴格的限制在處理英文卻省的排序順序通常是足夠的因為它首先排AZ然後是小寫字母az然而如果你處理非英文字或者你只是想使用不同的排序順序這樣Collectionssort()就出現了第二種變化例如你想使用字符串的反序進行排序為了實現這個功能你可以在Collections類中通過reverseOrder()來獲取一個反序Comparator然後你將反序Comparator傳遞給sort()方法換句話說你作如下工作
  
  List list = ;
  Comparator comp = CollectionsreverseOrder();
  Collectionssort(list comp);
  
  如果列表包含項目Man man Woman 和woman排序好的列表將是Man Woman man woman這裡沒有什麼復雜的需要注意的非常重要的一點是Collectionssort()是進行原位排序如果你需要保留原序需要先對原集合進行復制在排序就像這樣
  
  List list = ;
  List copyOfList = new ArrayList(list);
  Collectionssort(copyOfList);
  
  這裡排好序的列表是Man Woman man woman但是原始列表(Man man Woman woman)被保留了
  
  到目前為止排序是區分大小寫的你如何進行不去分大小寫的排序呢?一種實現方式是象這樣實現Comparator:
  
  public static class CaseInsensitiveComparator
  implements Comparator {
  public int compare(Object element
  Object element) {
  String lower =
  elementtoString()toLowerCase();
  String lower =
  elementtoString()toLowerCase();
  return pareTo(lower);
  }
  }
  
  
  你確實不需要手工的創建這個類而是你可以是用以存在的ComparatorCASE_INSENSIVTIVE_ORDER它是在String類中定義的
  
  這種實現方式有一點小小的問題Sort()算法提供穩定的排序並保持與原有序列相同的元素這意味著一個包含兩個元素womanWoman的列表將有不同的排序而這種不同是根據兩個元素在列表中出現的先後次序決定的
  
  語言的不同又會怎麼樣呢?javatext包提供了Collector和CollectionKey類來進行區分語言的排序這裡是例子:
  
  注意如果你的文本是本地語言而不是缺省語言你需要傳遞一個本地語種給getInstance()方法就象:
  
  public static class CollatorComparator
  implements Comparator {
  Collator collator = CollatorgetInstance();
  public int compare(Object element
  Object element) {
  CollationKey key = collatorgetCollationKey(
  elementtoString());
  CollationKey key = collatorgetCollationKey(
  elementtoString());
  return pareTo(key);
  }
  }
  
  你是在對集合關鍵字進行排序而不是實際的字符串這不僅提供固定的不區分大小寫的排序而且它是跨語種的排序換句話說如果你對西班牙文和非西班牙文的混合詞進行排序詞ma?ana (tomorrow)將排在mantra的前面如果你不使用Collectorma?ana將排在mantra的後面
  
  下面這個程序對一個列表進行不同類型的排序(缺省的區分大小寫的區分語種的)
  
  import javaawtBorderLayout;
  import javaawtContainer;
  import javaio*;
  import javatext*;
  import javautil*;
  import javaxswing*;
  
  public class SortIt {
  
  public static class CollatorComparator
  implements Comparator {
  Collator collator = CollatorgetInstance();
  public int compare(Object element
  Object element) {
  CollationKey key = collatorgetCollationKey(
  elementtoString());
  CollationKey key = collatorgetCollationKey(
  elementtoString());
  return pareTo(key);
  }
  }
  
  public static class CaseInsensitiveComparator
  implements Comparator {
  public int compare(Object element
  Object element) {
  String lower = elementtoString()
  toLowerCase();
  String lower = elementtoString()
  toLowerCase();
  return pareTo(lower);
  }
  }
  
  public static void main(String args[]) {
  String words[] =
  {man Man Woman woman
  Manana manana ma?ana Ma?ana
  Mantra mantra mantel Mantel
  };
  
  // Create frame to display sortings
  JFrame frame = new JFrame(Sorting);
  framesetDefaultCloseOperation(
  JFrameEXIT_ON_CLOSE);
  Container contentPane = framegetContentPane();
  JTextArea textArea = new JTextArea();
  JScrollPane pane = new JScrollPane(textArea);
  contentPaneadd(pane BorderLayoutCENTER);
  
  // Create buffer for output
  StringWriter buffer = new StringWriter();
  PrintWriter out = new PrintWriter(buffer);
  
  // Create initial list to sort
  List list = new ArrayList(ArraysasList(words));
  outprintln(Original list:);
  outprintln(list);
  outprintln();
  
  // Perform default sort
  Collectionssort(list);
  outprintln(Default sorting:);
  outprintln(list);
  outprintln();
  
  // Reset list
  list = new ArrayList(ArraysasList(words));
  
  // Perform case insensitive sort
  Comparator comp = new CaseInsensitiveComparator();
  Collectionssort(list comp);
  outprintln(Case insensitive sorting:);
  outprintln(list);
  outprintln();
  
  // Reset list
  list = new ArrayList(ArraysasList(words));
  
  // Perform collation sort
  comp = new CollatorComparator();
  Collectionssort(list comp);
  outprintln(Collator sorting:);
  outprintln(list);
  outprintln();
  
  // Fill text area and display
  textAreasetText(buffertoString());
  framepack();
  frameshow();
  }
  }
  
  如果你的主要問題是順序訪問可能列表不是你的好的數據結構選擇只要你的集合沒有重復你可以在樹(TreeSet)中保存你的元素(提供或不提供Comparator)這樣元素將總是排序形式的
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26066.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.