1. 程式人生 > >【我的Java開發學習之旅】如何實現中文漢字進行筆劃(筆畫)排序?

【我的Java開發學習之旅】如何實現中文漢字進行筆劃(筆畫)排序?

一、需求描述

最近有個需求,要求對列表進行排序,排序規則如下所示:

語言(文化)程式碼 國家/地區 排序方式
zh-CN 簡體中文(中國) 漢語拼音
zh-HK 繁體中文(中國香港特別行政區) 筆劃
zh-TW 繁體中文(中國臺灣) 筆劃

關於漢語拼音排序的很久之前就實現了,已經執行兩年了。筆劃排序的是剛剛要求新增的需求,因此得想辦法實現中文漢字進行筆劃排序。

二、如何實現中文漢字筆劃排序的需求?

進過百度搜索,最終搜尋到了下面的連結:

下面我們來測試下這個工具類。

2.1 測試 StringStrokeComparator排序

StringStrokeComparator排序,是對純粹的字串集合進行排序

在這裡插入圖片描述

2.1.1 測試程式

package com.oyp.csdn.test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import com.junfeng.strokesort.comparator.StringStrokeComparator;

public class TestStringStrokeComparator {

    public static void main(String[] args) {
        List<String> name = new ArrayList<String>();
        name.add("歐陽鵬");
        name.add("阿森鬆島");
        name.add("安道爾");
        name.add("阿拉伯聯合大公國");
        name.add("阿富汗");
        name.add("安地卡及巴布達");
        name.add("安圭拉");
        name.add("阿爾巴尼亞");
        name.add("亞美尼亞");
        name.add("安哥拉");
        name.add("南極洲");
        name.add("阿根廷");
        name.add("美屬薩摩亞");
        name.add("奧蘭群島");
        name.add("波士尼亞赫塞哥維納");
        name.add("巴林");
        name.add("聖巴泰勒米");
        name.add("汶萊");
        name.add("玻利維亞");
        name.add("聖克里斯多福及尼維斯");
        name.add("朝鮮");
        name.add("韓國");
        name.add("科威特");
        name.add("開曼群島");
        name.add("哈薩克");
        name.add("寮國");
        name.add("黎巴嫩");
        name.add("聖露西亞");
        name.add("薩爾瓦多");
        name.add("馬約特");
        name.add("臺灣(中國)");
        name.add("香港(中國)");
        name.add("澳門(中國)");
        name.add("蘇丹");

        //新增部分 生僻字
        name.add("嘣");
        name.add("嚋");
        name.add("蘇丹");
        name.add("嚌");
        name.add("囆");
        name.add("囎");
        name.add("囼");
        name.add("圀");
        name.add("壝");
        name.add("壝");
        name.add("墪");
        name.add("夨");
        name.add("夒");
        name.add("孅");
        name.add("孏");
        name.add("孆");
        name.add("媘");
        name.add("孑");
        name.add("孒");
        name.add("孓");
        name.add("孖");
        name.add("孠");
        name.add("孧");
        name.add("滽");
        name.add("滽");
        name.add("瀶");
        name.add("瀶");
        name.add("犪");
        name.add("犓");
        name.add("犫");

        /** 使用 */
        Collections.sort(name, new StringStrokeComparator());
        for (String string : name) {
            System.out.println(string);
        }
    }
}

2.1.2 測試結果

測試結果為:

孑
孒
孓
夨
巴林
臺灣(中國)
孖
安圭拉
安地卡及巴布達
安哥拉
安道爾
汶萊
阿拉伯聯合大公國
阿根廷
阿富汗
阿森鬆島
阿爾巴尼亞
亞美尼亞
囼
孠
孧
歐陽鵬
波士尼亞赫塞哥維納
南極洲
哈薩克
嚌
圀
玻利維亞
科威特
美屬薩摩亞
香港(中國)
馬約特
媘
朝鮮
開曼群島
聖巴泰勒米
聖克里斯多福及尼維斯
聖露西亞
嘣
奧蘭群島
滽
滽
犓
墪
寮國
澳門(中國)
黎巴嫩
薩爾瓦多
嚋
韓國
壝
壝
夒
蘇丹
蘇丹
孅
孆
瀶
瀶
囆
囎
孏
犪
犫

Process finished with exit code 0

2.2 測試 ObjectStrokeComparator 排序

ObjectStrokeComparator排序,可以對物件進行排序,指定使用物件的那個屬性進行排序

在這裡插入圖片描述

2.2.1 測試程式

測試程式碼如下所示:

package com.oyp.csdn.test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import com.junfeng.strokesort.comparator.ObjectStrokeComparator;
import com.junfeng.strokesort.model.Stroke;

public class TestObjectStrokeComparator {

	public static void main(String[] args) {
		List<Stroke> strokes = new ArrayList<Stroke>();
		Stroke stroke1 = new Stroke();
		stroke1.setName("張三無");
		strokes.add(stroke1);
		stroke1 = new Stroke();
		stroke1.setName("趙明紅匠");
		strokes.add(stroke1);
		stroke1 = new Stroke();
		stroke1.setName("李四");
		strokes.add(stroke1);
		stroke1 = new Stroke();
		stroke1.setName("王東棟");
		strokes.add(stroke1);
		stroke1 = new Stroke();
		stroke1.setName("李四仨");
		strokes.add(stroke1);
		stroke1 = new Stroke();
		stroke1.setName("張三");
		strokes.add(stroke1);
		stroke1 = new Stroke();
		stroke1.setName("歐陽鵬");
		strokes.add(stroke1);
		
		/** 使用 */
		Collections.sort(strokes, new ObjectStrokeComparator(Stroke.class, "name"));

		for (Stroke stroke : strokes) {
			System.out.println(stroke.getName());
		}

		System.out.println("----------");

		List<CountryOrRegion> countryOrRegionArrayList = new ArrayList<CountryOrRegion>();
		CountryOrRegion countryOrRegion = new CountryOrRegion();
		countryOrRegion.setName("阿森鬆島");
		countryOrRegionArrayList.add(countryOrRegion);
		countryOrRegion = new CountryOrRegion();
		countryOrRegion.setName("安道爾");
		countryOrRegionArrayList.add(countryOrRegion);
		countryOrRegion = new CountryOrRegion();
		countryOrRegion.setName("聖克里斯多福及尼維斯");
		countryOrRegionArrayList.add(countryOrRegion);
		countryOrRegion = new CountryOrRegion();
		countryOrRegion.setName("阿爾巴尼亞");
		countryOrRegionArrayList.add(countryOrRegion);
		countryOrRegion = new CountryOrRegion();
		countryOrRegion.setName("美屬薩摩亞");
		countryOrRegionArrayList.add(countryOrRegion);

		/** 使用 */
		Collections.sort(countryOrRegionArrayList, new ObjectStrokeComparator(CountryOrRegion.class, "name"));
		for (CountryOrRegion countryOrRegionItem : countryOrRegionArrayList) {
			System.out.println(countryOrRegionItem.getName());
		}

		System.out.println("----------");
		
		List<String> name = new ArrayList<String>();
		name.add("阿森鬆島");
		name.add("安道爾");
		name.add("阿拉伯聯合大公國");
		name.add("阿富汗");
		name.add("安地卡及巴布達");
		name.add("安圭拉");
		name.add("阿爾巴尼亞");
		name.add("亞美尼亞");
		name.add("安哥拉");
		name.add("南極洲");
		name.add("阿根廷");
		name.add("美屬薩摩亞");
		name.add("奧蘭群島");
		name.add("波士尼亞赫塞哥維納");
		name.add("巴林");
		name.add("聖巴泰勒米");
		name.add("汶萊");
		name.add("玻利維亞");
		name.add("聖克里斯多福及尼維斯");
		name.add("朝鮮");
		name.add("韓國");
		name.add("科威特");
		name.add("開曼群島");
		name.add("哈薩克");
		name.add("寮國");
		name.add("黎巴嫩");
		name.add("聖露西亞");
		name.add("薩爾瓦多");
		name.add("馬約特");
		name.add("臺灣(中國)");
		name.add("香港(中國)");
		name.add("澳門(中國)");
		name.add("蘇丹");
		/** 使用 */
		Collections.sort(name, new ObjectStrokeComparator(String.class, null));

		for (String string : name) {
			System.out.println(string);
		}
	}
}

其中 CountryOrRegion為自定義的一個java bean

package com.oyp.csdn.test;

public class CountryOrRegion {
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    /**
     * 國家或地區名
     */
    private String name;

    @Override
    public String toString() {
        return "CountryOrRegion{" +
                "name='" + name + '\'' +
                '}';
    }
}

2.2.2 測試結果

測試結果為:

王東棟
張三
張三無
李四
李四仨
歐陽鵬
趙明紅匠
----------
安道爾
阿森鬆島
阿爾巴尼亞
美屬薩摩亞
聖克里斯多福及尼維斯
----------
巴林
臺灣(中國)
安圭拉
安地卡及巴布達
安哥拉
安道爾
汶萊
阿拉伯聯合大公國
阿根廷
阿富汗
阿森鬆島
阿爾巴尼亞
亞美尼亞
波士尼亞赫塞哥維納
南極洲
哈薩克
玻利維亞
科威特
美屬薩摩亞
香港(中國)
馬約特
朝鮮
開曼群島
聖巴泰勒米
聖克里斯多福及尼維斯
聖露西亞
奧蘭群島
寮國
澳門(中國)
黎巴嫩
薩爾瓦多
韓國
蘇丹

Process finished with exit code 0

三、相關連結

擴充套件連結,基本實現原理:

要想得到有效的筆畫數,還得自己一個一個來做一個數據庫。

這個資料庫我弄好了,放在csdn,下載地址:

使用sqlite3命令開啟這個db檔案

在這裡插入圖片描述

內容如下所示,總共有20902個漢字,滿足了日常的需求了。

在這裡插入圖片描述
在這裡插入圖片描述

直接 通過命令將這個db檔案匯出來。

在這裡插入圖片描述

sqlite3 ChinessStroke.db
SQLite version 3.22.0 2018-01-22 18:45:57
Enter ".help" for usage hints.
sqlite> .output ChinessStroke.dat
sqlite> select * from BI_HUA_BEAN;
sqlite> .output stdout
sqlite>

生成的 ChinessStroke.dat檔案內容如下:
在這裡插入圖片描述

四、在Android上實現中文筆畫排序

效果如下:

在這裡插入圖片描述

相關推薦

Java開發學習如何實現中文漢字進行筆劃(筆畫)排序

一、需求描述 最近有個需求,要求對列表進行排序,排序規則如下所示: 語言(文化)程式碼 國家/地區 排序方式 zh-CN 簡體中文(中國) 漢語拼音 zh-HK 繁體中文(中國香港特別行政區) 筆劃 zh-TW 繁體中文(中國臺灣) 筆劃

Java開發學習------&gt;Workspace in use or cannot be created, choose a different one.--錯誤解決的方法

原因 tracking size ons create rac 分享 target mono 今天使用Eclipse時,突然卡死了。然後我強制關閉了Eclipse,再又一次打開的時候就報錯了,錯誤例如以下: Workspace in use or cann

Java開發學習------>Java String物件作為引數傳遞的問題解惑

又是一道面試題,來測試你的Java基礎是否牢固。 題目:以下程式碼的執行結果是? public class TestValue { public static void test(String

Java開發學習------>Java經典排序演算法二分插入排序

一、折半插入排序(二分插入排序) 將直接插入排序中尋找A[i]的插入位置的方法改為採用折半比較,即可得到折半插入排序演算法。在處理A[i]時,A[0]……A[i-1]已經按關鍵碼值排好序。

Java開發學習------>Java資源的國際化詳解

國際化相關的Java類 Java國際化主要通過如下3個類完成 java.util.ResourceBundle:用於載入一個資源包 java.util.Locale:對應一個特定的國家/區域、語言環境。 java.text.MessageFormat:用於將訊息格式化 國際化資原始檔 為實現程式的

Java開發學習------>Java利用Comparator介面對多個排序條件進行處理

一、需求 假設現在有個如此的需求:需要對一個這樣的僱員列表進行排序,排序規則如下: 1、首先級別最高的排在前面, 2、如果級別相等,那麼按工資排序,工資高的排在前面, 3、如果工資相當則按入職年數排序,入職時間最長的排在前面。

小小何先生的學習自己的學習筆記,歡迎志同道合的朋友聯絡,一起學習交流。

自我介紹 相關學習資源: 機器學習:https://github.com/18279406017/awesome-machine-learning;強化學習:https://github.com/18279406017/awesome-reinforcement-lear

java學習——JSTL+EL表示式讓jsp頁面簡潔化

【前言】 jsp2.0之後,頁面上幾乎不使用Java指令碼了,其實不難理解,因為在計算機中程式分工越來越明確,三層,mvc的使用都是程式劃分層次結構的產物,jsp只能用做頁面的顯示,所以JSTL標

的Web後端開發學習03

Python MTV(MVC) M: model 模型層 操作資料庫 T: template 模板層 顯示資料庫 V: view 控制層 接收使用者請求,響應請求 MTV步驟 開啟pycharm建立一個Django專案 ( 根據python版

的Web後端開發學習01

web架構: ​ C/S: client(客戶端)/server(伺服器端) ​ 跨平臺性差 ​ B/S: browser(網頁端)/server(伺服器端) ​ 跨平臺性強 用的多 ​ web分類: ​ 靜態

Hasen的linux設備驅動開發學習--時鐘

interval 好的 mask 再次 ask 中斷處理程序 eas 中斷 基礎 /** * Author:hasen * 參考 :《linux設備驅動開發具體解釋》 * 簡單介紹:android小菜鳥的linux * 設備驅動開發學習之

的RabbitMQ學習3 (發布/訂閱)

fan 一點 簡單 圖片 數據 這一 auto sha 如果 在前面的教程中,我們創建了一個工作隊列。工作隊列背後的假設是,每個任務只被傳遞給一個工作人員。在這一部分,我們將做一些完全不同的事情 - 我們會向多個消費者傳遞信息。這種模式被稱為“發布/訂閱&rdq

的機器學習(四):回歸與工程應用

多個 算法 ati function RR numpy pen 圖片 bsp 內容:線性回歸;邏輯回歸,應用場景。 一、線性回歸 有監督學習,根據學習樣本{x->y},學習一個映射f:X->Y(線性相關),輸出預測結果y_i。最簡單的例子:y=ax+b 重要組成

的機器學習(六):決策樹

family 分配 根據 drop chrom labels arch ntp -o 決策樹概念: 分類決策樹模型是一種描述對實例進行分類的樹形結構。決策樹由結點和有向邊組成。結點有兩種類型:內部節點和葉節點,內部節點表示一個特征或屬性,葉節點表示一個類。 分類的時候,從根

Java開發學習java泛型方法 java編程

java開發 java編程 java學習 java入門 Java泛型方法和泛型類支持程序員使用一個方法指定一組相關方法,或者使用一個類指定一組相關的類型。Java泛型是JDK 5中引入的一個新特性,泛型提供了編譯時類型安全檢測機制,該機制允許程序員在編譯時檢測到非法的類型。使用Java泛型的概

Java開發學習java基本數據類型

培訓班 otto oat style 簡單 lean 實用 類型 str 數據類型是每個編程語言必不可少的基礎知識,也是必須要掌握的技能,很多人知識簡單的進行理解,並沒有很系統的進行知識的梳理,以下是對java語言的內置數據類型匯總:  Java語言有8種基本類型。6種數字

的Python學習(02)

我的Python學習之旅(02) 基本資料型別及變數的使用 list和tuple 條件判斷和迴圈 dict和set 好,接著上次的話題來說說Python的資料型別 首先,說個題外話,推薦學習python的大家去看看廖雪峰老師的部落格,講得

的Python學習(01)

我的Python學習之旅(01) 初識Python Hello World Python的輸入輸出 基本資料型別及變數的使用 list和tuple 條件判斷和迴圈 dict和set Python概要 Python

記錄的Python學習(二)time庫的基本操作

1、time() 功能:獲取當前時間戳,即計算機內部時間值,浮點數  2、ctime() 功能:獲取當前時間並以易讀方式表示,返回字串 3、gmtime() 功能:獲取當前實踐,表示為計算機可處理的時間格式  4、時間格式化:如t=time.gmtime()  

記錄的Python學習(一)關於turtle庫的基本用法

關於庫函式的匯入方法:①import <> ②import <> as <> ③ from tutle import <>   1、turtle.setup(width,height,startx,starty)  /