1. 程式人生 > >在java中使用TreeMap進行中文排序

在java中使用TreeMap進行中文排序

最近遇到需要按一個model中不同的列進行排序的問題,查了一下JDK API文件,發現,java中可以排序的工具類和介面共有五個SortedMap 、SortedSet、TreeMap 、TreeSet和Collections,由於我要排序的是一系列model,所以,最後使用了TreeMap物件,而且TreeMap到最後的處理比較自由,可以直接返回TreeMap物件,也可以返回model的一個Collection物件。其它幾個類的用法其實都是大同小異,如果java基礎較好,看一下API文件很容易明白,只是Collection中需要顯式呼叫sort()方法而已。

       寫理論的東西或者深入的東西就會太多了,而且讓人會看得比較煩,這裡講求實用,就不多說了,直接入正體,基本的排序程式碼如下:

       /***************************

       * 類名:TestSort.java

       * 作者:啊       ***************************/

package ChineseSort;

import java.util.Collection;

import java.util.Iterator;

import java.util.SortedMap;

import java.util.TreeMap;

 

/**

 * @author  

 *

 */

public class TestSort {

 /**

 * @param args

 */

public static void main(String[] args) {

    // TODO Auto-generated method stub    

    TreeMap map = new TreeMap();      

        for(int i=0; i<10; i++) {

        String  s = ""+(int)(Math.random()*1000);

        map.put(s,s);

    }

    map.put("abcd","abcd");

    map.put("Abc", "Abc");

    map.put("bbb","bbb");

    map.put("BBBB", "BBBB");

    map.put("北京","北京");

    map.put("中國","中國");

    map.put("上海", "上海");

    map.put("廈門", "廈門");

    map.put("香港", "香港");

    map.put("碑海", "碑海");

    Collection col = map.values();

    Iterator it = col.iterator();

    while(it.hasNext()) {

        System.out.println(it.next());

    }

}

}


        程式碼就不多作解釋了,一看就明白,開始放進去10個整數隨機數,然後是英文,然後是中文。執行結果如下:

132

205

287

295

399

410

411

464

670

73

Abc

BBBB

abcd

bbb

上海

中國

北京

廈門

碑海

香港

   注意,這裡的數字排序正常,而英文排序是區分大小寫的,這個也是正常的,因為ASCII碼中小寫字母比大寫字母靠後,中文排序則明顯的不正確,碑和北明顯應該在一起的,而且應該在最前面。這個主要是java中使用中文編碼GB2312或者JBK時,char型轉換成int型得過程出現了比較大的偏差,很多文章介紹過了,大家可以去網上找一下,這裡不多說了,直接尋找解決方案。

        Java中之所以出現偏差,主要是compare方法的問題,所以這裡自己實現Comparator介面,而國際化的問題,使用Collator類來解決。這裡先解決中文問題,程式碼如下:

 /**********************************

       * 類名:CollatorComparator.java

       * 作者:啊       **********************************/

package ChineseSort;

 import java.text.CollationKey;

import java.text.Collator;

import java.util.Comparator;

 

/**

 * @author

 *

 */

public class CollatorComparator implements Comparator {

Collator collator = Collator.getInstance();

 public int compare(Object element1, Object element2) {

    CollationKey key1 = collator.getCollationKey(element1.toString());

    CollationKey key2 = collator.getCollationKey(element2.toString());

    return key1.compareTo(key2);

}

}


        同時修改我們前面完成的TestSort類,找到

        TreeMap map = new TreeMap();

        修改為

    CollatorComparator comparator = new CollatorComparator();

    TreeMap map = new TreeMap(comparator);

     再次執行該類,執行結果如下:

325

62

653

72

730

757

874

895

909

921

Abc

abcd

bbb

BBBB

碑海

北京

上海

廈門

香港

中國

        此時可以看到中文的排序已經完成正常。如果想不讓英文區分大小寫,則修改CollatorComparator類,找到

     element1.toString()

     修改為:

     element1.toString().toLowerCase()

     當然你改成轉換成大寫的也無所謂了,當然element2.toString()也要同時修改為element2.toString().toLowerCase()。再次執行結果如下:

207

353

656

659

770

789

857

861

931

984

Abc

abcd

bbb

BBBB

碑海

北京

上海

廈門

香港

中國

     現在可以看到,排序已經完全符合我們的要求了。如果要反向排序也很容易,遍歷的時候倒過來,或者你寫兩個Comparator的實現類,正向的排序就像我們前面所寫的,反向排序就將return key1.compareTo(key2);修改成return -key1.compareTo(key2);,加了個負號,這裡你可以直接加個符號看看效果,結果我就不寫了,肯定中國是Number One。我還真沒找到TreeMap裡直接反向的方法,誰看到了告訴我。


相關推薦

java使用TreeMap進行中文排序

最近遇到需要按一個model中不同的列進行排序的問題,查了一下JDK API文件,發現,java中可以排序的工具類和介面共有五個SortedMap 、SortedSet、TreeMap 、TreeSet和Collections,由於我要排序的是一系列model,所以

javaTreeMap自定義排序以及一個鍵對應多個值問題

在最近寫的一個工程裡用到了TreeMap這個資料結構,TreeMap是SortedMap介面基於紅黑樹的實現,該類保證了對映按照升序排列關鍵字,根據使用的構造方法不同,可能會按照鍵的類的自然順序進行排序,或者按照建立時所提供的比較器進行排序。插入該對映的所有鍵必須是可以

JavaComparator進行對象排序

pri 排序 pub use clas .com get 變化 class Java在8後引入了lambda表達式和流,使得排序方法有了變化 class User { int id; String name; public User(int id,

js 對 select 的 option 進行中文排序問題

從資料庫中讀取出 select 列表的 option 值是按照資料庫中的順序進行排列的,有時需要對 optiion 的中文按照字母序進行排序,這時需要注意的問題是  option 的 text 值 和 value 值要同時排序。這樣提交 form 表單將資料提交到資料庫時就

java實現根據中文首字母排序

package awu.demo; import java.text.Collator; import java.util.Arrays; import java.util.Comparator;

Java 如何進行 BASE64 編碼和解碼

解碼 clas nal upd getch 根據 數組 格式 並且 BASE64 編碼是一種常用的字符編碼,在很多地方都會用到。JDK 中提供了非常方便的 BASE64Encoder 和 BASE64Decoder,用它們可以非常方便的完成基於 BASE64 的編碼和解碼。

Java的七種排序方式代碼示例

分法 快速 eth san esc AR 升序 num 算法 package baseJava; /** * @title SortMethods.java * @author DonsenChen * @Date 2018年5月2日 上午10:16:03 *

Java對jsonArray的排序,使用的是Gson

rtt 默認 gen ati object soa col tdi 測試 使用Gson對json解析字符串,轉化為json對象. 先上代碼: 下面是main方法裏面的代碼 package testJava; import java.util.ArrayList; imp

Java 最全的排序彙總

【附示例】Java程式設計師必知的8大排序 8種排序之間的關係: 1、直接插入排序 (1)基本思想:在要排序的一組數中,假設前面(n-1)[n>=2] 個數已經是排 好順序的,現在要把第n個數插到前面的有序數中,使得這n個數 也是排好順序的。如此反覆迴圈,直到全部排好順序。

Java陣列的選擇排序,選擇排序優化

選擇排序: 思路: int arr[]= {5,6,2,4,3,1}; //這個"[]“放在arr後面也是可以的,和C語言一樣 流程: 第一輪比較 if(arr[0]>arr[1]){ //這裡 5不大於6,什麼都不做 int tem

Java陣列的氣泡排序,氣泡排序優化

氣泡排序: 思路: int[] arr={3,4,2,6,1}; 1.第一次排序,從索引[0]開始,依次兩兩比較。索引[0]與[1]比,[1]與[2]比,[2]與[3]比…… if(arr[0]<arr[1]){

JAVA如何將快速排序

在JAVA中如何將陣列快速排序 在c語言中,我們想要給一個數組排序,就必須一步步寫演算法,而在面向物件的JAVA 語言中,我們直接使用已經封裝好的函式即可。sort這個函式可以直接用來給已知陣列排序,但是在呼叫之前我麼需要找到放置它的位置。 import

JavaMap按Value排序

前言 Map是鍵值對的集合介面,它的實現類主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等。 TreeMap 基於紅黑樹(Red-Black tree)的 NavigableMap 實現,該對映根據其鍵的自然順序進行排序,或者

Java如何進行加密和數字簽名

本文主要談一下密碼學中的加密和數字簽名,以及其在java中如何進行使用。對密碼學有興趣的夥伴,推薦看Bruce Schneier的著作:Applied Crypotography。在jdk1.5的發行版本中安全性方面有了很大的改進,也提供了對RSA演算法的直接支援,現在我們

java陣列常見的排序問題整理

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"&g

JavaArrayList 元素的排序

ArrayList 是一種 List 實現,它的內部用一個動態陣列來儲存元素,因此 ArrayList 能夠在新增和移除元素的時候進行動態的擴充套件和縮減。 <一> 排序字串的ArrayList ArrayList中儲存的是String型

java二維陣列排序

package practice; import java.util.Scanner; public class Paixu{ static void sort2(int n,int m){ System.out.println("隨機產生的"+n+"行"+m+"列陣列:"

Java Arrays類進行陣列排序

Java API對Arrays類的說明是:此類包含用來運算元組(比如排序和搜尋)的各種方法。 1.對基本資料型別的陣列的排序    說明:(1)Arrays類中的sort()使用的是“經過調優的快速排序法”;       (2)比如int[],double[],char

Java常見的陣列排序演算法(包括冒泡,選擇,插入,快速排序)

1 public static void bubbleSort(int[] arr) { 2 3    for(int x=0; x<arr.length-1; x++) { 4 5    for(int y=0; y<arr.length-x-

JAVAJVM的重排序詳細介紹

在併發程式中,程式設計師會特別關注不同程序或執行緒之間的資料同步,特別是多個執行緒同時修改同一變數時,必須採取可靠的同步或其它措施保障資料被正確地修改,這裡的一條重要原則是:不要假設指令執行的順序,你無法預知不同執行緒之間的指令會以何種順序執行。 但是在單執行緒程式中,通常我們容易假設指令是順序執行的,否則