1. 程式人生 > >實現按照字母分類分組排序

實現按照字母分類分組排序

這裡寫圖片描述
為了實現上圖字母分類排序
實現過程借鑑了網上 大神的部落格筆記
http://www.cnblogs.com/fxiaoquan/p/4724208.html
實現過程如下:
下載 pinyin.c 和 pinyin.h 檔案 匯入到專案中
這裡寫圖片描述
這裡建立一個處理物件的資料模型
這裡寫圖片描述
將大神的程式碼copy到模型中 替換成自己想要的資料模型

//
//  ChineseString.h
//  SAGA_iOS
//
//  Created by  location on 16/8/10.
//  Copyright © 2016年 it.sozi. All rights reserved.
//

#import <Foundation/Foundation.h>
#import
"PinYin.h" #import "CZHomeSearchBrandItem.h" @interface ChineseString : NSObject @property(nonatomic,copy) NSString *string; @property(nonatomic,copy) NSString *pinYin; @property(nonatomic,strong)CZHomeSearchBrandItem *brandItem; /** * TableView右方IndexArray */ +(NSMutableArray *) IndexArray:(NSArray *) stringArr; /** * 文字列表 */
+(NSMutableArray *) LetterSortArray:(NSArray *)stringArr; /** *返回一組字母排列陣列(中英混排) */ +(NSMutableArray *) SortArray:(NSArray *)stringArr;

實現檔案

//
//  ChineseString.m
//  SAGA_iOS
//
//  Created by  location on 16/8/10.
//  Copyright © 2016年 it.sozi. All rights reserved.
//

#import "ChineseString.h"

@implementation
ChineseString
- ( id )init { if ( self = [ super init ]) { } return self ; } #pragma mark - 返回tableview右方 indexArray +(NSMutableArray*)IndexArray:(NSArray*)stringArr { NSMutableArray *tempArray = [self ReturnSortChineseArrar:stringArr]; NSMutableArray *A_Result=[NSMutableArray array]; NSString *tempString ; for (NSString* object in tempArray) { NSString *pinyin = [((ChineseString*)object).pinYin substringToIndex:1]; //不同 if(![tempString isEqualToString:pinyin]) { [A_Result addObject:pinyin]; tempString = pinyin; } } return A_Result; } #pragma mark - +(NSMutableArray*)LetterSortArray:(NSArray*)stringArr { NSMutableArray *tempArray = [self ReturnSortChineseArrar:stringArr]; NSMutableArray *LetterResult=[NSMutableArray array]; NSMutableArray *item = [NSMutableArray array]; NSString *tempString; //拼音分組 for (NSObject* object in tempArray) { NSString *pinyin = [((ChineseString*)object).pinYin substringToIndex:1]; CZHomeSearchBrandItem *brandItem=((ChineseString*)object).brandItem; //不同 if(![tempString isEqualToString:pinyin]) { //分組 item = [NSMutableArray array]; [item addObject:brandItem]; [LetterResult addObject:item]; //遍歷 tempString = pinyin; }else//相同 { [item addObject:brandItem]; } } return LetterResult; } /** * 過濾指定字串 裡面的指定字元根據自己的需要新增 */ +(NSString*)RemoveSpecialCharacter: (NSString *)str { NSRange urgentRange = [str rangeOfCharacterFromSet: [NSCharacterSet characterSetWithCharactersInString: @",.?、 ~¥#&<>《》()[]{}【】^@/£¤|§¨「」『』¢¬ ̄[email protected]#&*()——+|《》$_€"]]; if (urgentRange.location != NSNotFound) { return [self RemoveSpecialCharacter:[str stringByReplacingCharactersInRange:urgentRange withString:@""]]; } return str; } /** * 返回排序好的字元拼音 * */ +(NSMutableArray*)ReturnSortChineseArrar:(NSArray*)stringArr { //獲取字串中文字的拼音首字母並與字串共同存放 NSMutableArray *chineseStringsArray=[NSMutableArray array]; for(int i=0;i<[stringArr count];i++) { ChineseString *chineseString=[[ChineseString alloc]init]; CZHomeSearchBrandItem *brandItem=[stringArr objectAtIndex:i]; chineseString.brandItem=brandItem; chineseString.string=[NSString stringWithString:brandItem.name]; if(chineseString.string==nil){ chineseString.string[email protected]""; } //去除兩端空格和回車 chineseString.string = [chineseString.string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; //此方法存在一些問題 有些字元過濾不了 //NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString:@"@/:;()¥「」"、[]{}#%-*+=_\\|~<>$€^•'@#$%^&*()_+'\""]; //chineseString.string = [chineseString.string stringByTrimmingCharactersInSet:set]; //這裡我自己寫了一個遞迴過濾指定字串 RemoveSpecialCharacter chineseString.string =[ChineseString RemoveSpecialCharacter:chineseString.string]; // NSLog(@"string====%@",chineseString.string); //判斷首字元是否為字母 NSString *regex = @"[A-Za-z]+"; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex]; NSString *initialStr = [chineseString.string length]?[chineseString.string substringToIndex:1]:@""; if ([predicate evaluateWithObject:initialStr]) { NSLog(@"chineseString.string== %@",chineseString.string); //首字母大寫 chineseString.pinYin = [chineseString.string capitalizedString] ; }else{ if(![chineseString.string isEqualToString:@""]){ NSString *pinYinResult=[NSString string]; for(int j=0;j<chineseString.string.length;j++){ NSString *singlePinyinLetter=[[NSString stringWithFormat:@"%c", pinyinFirstLetter([chineseString.string characterAtIndex:j])]uppercaseString]; pinYinResult=[pinYinResult stringByAppendingString:singlePinyinLetter]; } chineseString.pinYin=pinYinResult; }else{ chineseString.pinYin[email protected]""; } } [chineseStringsArray addObject:chineseString]; } //按照拼音首字母對這些Strings進行排序 NSArray *sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"pinYin" ascending:YES]]; [chineseStringsArray sortUsingDescriptors:sortDescriptors]; return chineseStringsArray; } #pragma mark - 返回一組字母排序陣列 +(NSMutableArray*)SortArray:(NSArray*)stringArr { NSMutableArray *tempArray = [self ReturnSortChineseArrar:stringArr]; //把排序好的內容從ChineseString類中提取出來 NSMutableArray *result=[NSMutableArray array]; for(int i=0;i<[stringArr count];i++){ [result addObject:((ChineseString*)[tempArray objectAtIndex:i]).string]; } return result; }

在獲取資料的控制器頁面匯入#import “ChineseString.h”
@property(nonatomic,strong)NSMutableArray *indexArray;//去重後的首字母
@property(nonatomic,strong)NSMutableArray *letterResultArr;//按照首字母排序後的集合
初始化兩個陣列來接收排序後的資料
實現相應的類方法

-(void)setWatchBrands:(NSArray *)watchBrands
{
    _watchBrands = watchBrands;
    if (watchBrands) {
        //返回tableview右方 indexArray
        self.indexArray = [ChineseString IndexArray:watchBrands];
        self.letterResultArr = [ChineseString LetterSortArray:watchBrands];
    }

    [self.tableView reloadData];
}

以上就已經將後臺返回的資料 進行字母編排 編排後賦值給相應的陣列 tableView 實現對應的資料來源 和代理方法

//多少組
- (NSInteger)numberOfSectionsInTableView:( UITableView *)tableView
{

    return self.indexArray.count;

}

//每組中有多少行
- (NSInteger)tableView:( UITableView *)tableView numberOfRowsInSection:( NSInteger )section
{

    return [[self.letterResultArr objectAtIndex:section]count];

}

// 為 section 新增標題
- (NSString *)tableView:( UITableView *)tableView titleForHeaderInSection:( NSInteger )section
{

    return [self.indexArray objectAtIndex :section];

}

//tableView 右邊顯示的字母
- (NSArray *)sectionIndexTitlesForTableView:( UITableView *)tableView
{

    return self.indexArray;

}



#pragma mark - Table view data source

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *brandID [email protected]"brandID";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:brandID];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:brandID];
    }
    CZHomeSearchBrandItem *brandItem = [[self.letterResultArr objectAtIndex:indexPath.section]objectAtIndex:indexPath.row];
    cell.textLabel.text = brandItem.name;
    cell.textLabel.font = CZFontMiddle;
    cell.textLabel.textColor = CZColor(@"#333333");
    return cell;
}

相關推薦

實現按照字母分類分組排序

為了實現上圖字母分類排序 實現過程借鑑了網上 大神的部落格筆記 http://www.cnblogs.com/fxiaoquan/p/4724208.html 實現過程如下: 下載 pinyin.c 和 pinyin.h 檔案 匯入到專案中 這

java中英文獲取首字母之後分組排序

package com.syz; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @author shiyz

mysql 按照漢字的拼音排序按照字母分類

專案中有時候需要按照漢字的拼音排序,比如聯絡人列表、礦物分類等,有的還需要按拼音字母從A到Z分類顯示。   如果儲存漢字的欄位編碼使用的是GBK字符集,因為GBK內碼編碼時本身就採用了拼音排序的方法(常用一級漢字3755個採用拼音排序,二級漢字就不是了,但考慮到人名等都是常

android 實現按照城市首字母(拼音)分類的應用

最近按照公司需要,寫了一個按照城市首字母排序的demo,原理就是獲取城市名稱,然後將城市名稱轉換為相應的拼音,通過對拼音的排序進而得到一個序列,實現了按照首字母分類的功能。上程式碼:獲得城市資訊,此處為假資料,大家可以自行新增自己的伺服器端資料:/* * 繫結城市資訊,此處

mapreduce,自定義排序,分割槽,分組實現按照年份升序排序,溫度降序排序

自定義類: package myhadoop; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; import org.apache.hadoop.io.Wr

含有對象的List集合實現字母數字混合排序

gets 以及 實現 基本 ride man substring new 混合 List<PageData> varList = [{BOMCode=10A, mantotal=4}, {BOMCode=10B, mantotal=1}, {BOMCo

mysql實現字母從A-Z排序

b2c cde var urn cti 字母 mys hex desc 1.常規排序ASC DESC ASC 正序 DESC倒敘 -- 此處不用多講 2.自定義排序 自定義排序是根據自己想要的特定字符串(數字)順序進行排序。主要是使用函數 FIELD(str,st

entity framework 實現按照距離排序

在做專案時,經常會遇到“離我最近”這種需求。顧名思義,它需要根據使用者的經緯度和事物的經緯度計算距離,然後進行排序,最後分頁(當然這些操作要在資料庫中進行,否則就變成假分頁了)。 我們通常可以用sql語句來實現 SELECT es_name, es_lon, es_lat,

如何實現按照計算後的結果排序

在做分組報表統計時,我們經常會被要求按照資料升序或降序排序。在 group 函式的引數中,我們可以指定分組後對組的排序表示式,這樣報表展現時能夠直接根據該表示式進行排序了。我們先來看一個簡單的例子,如下圖所示: 其中,A1 表示式為:=ds1.group(貨主地區, 貨主地區!=null;

UILocalizedIndexedCollation -- 本地化下按首字母分組排序

關於通訊錄的專案就會有按首字母或者漢字拼音首字母分組排序索引。說說以前用的就是 比如把漢字轉成拼音再排序的方法了,不僅效率低,對其他語言的本地化更是行不通。偶然間在閱讀別人的程式碼時發現了UILocalizedIndexedCollation,於是搜尋相關資料,整理了一下。參考自文章http://n

ItemDecoration詳解以及用ItemDecoration實現字母排序列表

首先看看實現的效果 可以看出要實現上面效果,有三個步驟: 1.漢字轉化為拼音,並且根據首字母排序 2.用ItemDecoration實現字母行的顯示 3.自定義實現右側的按字母導航欄 當然重點講講ItemDecoration的實現。都知道RecyclerView本

Pandas---實現SQL中分組排序

hive中經常會用到row_number這個函式,比如取使用者第n次購買,前n次購買記錄等等。那麼python中如何實現呢?直接看個例子即可 下面是a、b兩個使用者購買的記錄,user為使用者名稱,amount為消費金額,要去按照user分組,組內按照amount降序排序,並且新增一

用php實現mongodb 分組排序

$keys = array('type'=>1); //依據type欄位分組 $initial = array("items" => array('CreateTime'=>0)); //帶到reduce中初始化 $reduce = "function (

快速整合android實現listview的字母A-Z排序,介面側邊字母索引

public abstract class MyExpandAdapter implements ExpandableListAdapter{ //用抽象方法把下拉子選單的不用的方法集中在這裡,方便觀看 //抽象出介面,回撥方法,用方法繼承就可以定義子選單 @Override

mysql分組排序取最大值所在行的實現方法

序號 sele 最大 logs tro ubi select order by 應該 如下圖, 計劃實現 :按照 parent_code 分組, 取組中code最大值所在的整條記錄,如紅色部分。(類似hive中: row_number() over(partition b

java實現按照檔案的修改時間排序資料夾下的檔案

public int compare(Object o1, Object o2) { File file1 = (File)o1; File file2 = (F

PHP實現對多維陣列按照某個鍵值排序的兩種解決方法

實現對多維陣列按照某個鍵值排序的兩種解決方法(array_multisort和array_sort): 第一種: array_multisort()函式對多個數組或多維陣列進行排序。 //對陣列$h

Android陣列列表按照字母排序

使用環境: 類似手機聯絡人電話本,微信聯絡人目錄一樣的功能。聯絡人按照字典排序,相同字母的聯絡人放一起。 不需要依賴第三方jar包,用心看,思路清晰。 使用方法: 算了,免費下載去吧,程式碼比較容易點。 因為剛好更新了studio,如果版本不合適,可以直接賦值程式碼走人,缺

Oracle資料庫rank()over(partition by order by)實現分組 排序 取前幾資料

Oracle1.使用 rank()over(order by)得到記錄排序根據工資排名,排名相同的時候下一個排名累加,比如第三和第四工資一樣,那麼第三第四排名都是3,第五排名是5而非4dense_rank()實現的效果不累加,第五仍是4例:select code 編號,sal