- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 NSComparisonResult
按特定顺序对我的数组进行排序。我无法弄清楚如何实现我想要的序列。
我正在尝试将表情符号置于顶部(表情符号的顺序无关紧要),然后是 A-Z 字母,在大写字母之前给予小写字母权重,然后是数字,然后是标点符号,然后是符号,等等其他之后我现在不关心。到目前为止,我已经很接近了,但我仍然没有达到我想要的效果。
我尝试实现的序列输出如下所示:
("\Ud83d\Ude03",
a,
A,
aa,
aA,
ab,
aB,
a1,
A1,
1,
01,
11,
001,
0001,
1001,
"#",
"#a",
"#1",
"$12",
"$0012")
基于这个数组作为输入:
@[ @"a", @"aA", @"aa", @"A", @"aB", @"11", @"1001", @"ab", @"001", @"01",
@"a1", @"A1", @"😃", @"0001", @"1", @"#", @"$12", @"$0012", @"#a", @"#1" ];
但这是我得到的输出:
("\Ud83d\Ude03",
a,
A,
aA,
aa,
aB,
ab,
a1,
A1,
0001,
001,
01,
1,
1001,
11,
"#a",
"#1",
"$0012",
"$12",
"#")
代码:
- (NSArray *)sortedArray:(NSArray *)input
{
NSArray *newArray = [input sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2)
{
NSString *nameOne = obj1;
NSString *nameTwo = obj2;
NSString *startOne;
NSString *startTwo;
NSInteger currentIndex = 0;
NSInteger maxIndex = (nameOne.length < nameTwo.length) ? nameOne.length : nameTwo.length;
NSCharacterSet *decimalDigitCharSet = [NSCharacterSet decimalDigitCharacterSet];
NSCharacterSet *punctuationCharSet = [NSCharacterSet punctuationCharacterSet];
NSCharacterSet *symbolCharSet = [NSCharacterSet symbolCharacterSet];
NSMutableCharacterSet *nonPriorityCharSet = [[NSMutableCharacterSet alloc]init];
[nonPriorityCharSet formUnionWithCharacterSet:punctuationCharSet];
[nonPriorityCharSet formUnionWithCharacterSet:symbolCharSet];
do
{
if (currentIndex < maxIndex)
{
startOne = [nameOne substringWithRange:NSMakeRange(currentIndex, 1)];
startTwo = [nameTwo substringWithRange:NSMakeRange(currentIndex, 1)];
currentIndex++;
}
else
{
if (nameOne.length == nameTwo.length)
{
return NSOrderedSame;
}
else
{
return (nameOne.length < nameTwo.length) ? NSOrderedAscending : NSOrderedDescending;
}
}
}
while ([startOne isEqualToString:startTwo]);
{
NSRange rangeOne = [startOne rangeOfCharacterFromSet:nonPriorityCharSet];
NSRange rangeTwo = [startTwo rangeOfCharacterFromSet:nonPriorityCharSet];
if (rangeOne.length > 0 || rangeTwo.length > 0)
{
return (rangeOne.length > 0) ? NSOrderedDescending : NSOrderedAscending;
}
NSRange decimalRangeOne = [startOne rangeOfCharacterFromSet:decimalDigitCharSet];
NSRange decimalRangeTwo = [startTwo rangeOfCharacterFromSet:decimalDigitCharSet];
if (decimalRangeOne.length > 0 || decimalRangeTwo.length > 0)
{
if (decimalRangeOne.length == decimalRangeTwo.length)
{
return (startOne.intValue > startTwo.intValue) ? NSOrderedDescending : NSOrderedAscending;
}
else if (decimalRangeOne.length > decimalRangeTwo.length)
{
return NSOrderedDescending;
}
else if (decimalRangeTwo.length > decimalRangeOne.length)
{
return NSOrderedAscending;
}
}
}
return [nameOne localizedCaseInsensitiveCompare:nameTwo];
}];
return newArray;
}
最佳答案
你的开始很好。但是您没有正确检查您设置的所有规则。我根据您的规则创建了一些类别,并使用它们进行排序。
- (NSArray *)sortedArray:(NSArray *)input
{
__block id blocksafeSelf = self;
NSArray *newArray = [input sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
NSString *nameOne = obj1;
NSString *nameTwo = obj2;
NSInteger currentIndex = 0;
unichar charOne = [nameOne characterAtIndex:0];
unichar charTwo = [nameTwo characterAtIndex:0];
short maxLength = MIN(nameOne.length, nameTwo.length);
do {
charOne = [nameOne characterAtIndex:currentIndex];
charTwo = [nameTwo characterAtIndex:currentIndex];
currentIndex ++;
}
while (charOne == charTwo && currentIndex < maxLength);
short oneCategory = [blocksafeSelf getCharCategory:charOne];
short twoCategory = [blocksafeSelf getCharCategory:charTwo];
if (oneCategory != twoCategory) {
return oneCategory > twoCategory;
}
else if (oneCategory != 1) {
if (nameOne.length != nameTwo.length) {
return nameOne.length > nameTwo.length;
}
else {
return charOne > charTwo;
}
}
else {
if (nameOne.length != nameTwo.length) {
return nameOne.length > nameTwo.length;
}
else {
oneCategory = [blocksafeSelf getLetterCategory:charOne];
twoCategory = [blocksafeSelf getLetterCategory:charTwo];
if (oneCategory == twoCategory) {
return charOne > charTwo;
}
else {
unichar tempCharOne = oneCategory == 7 ? charOne + 32 : charOne;
unichar tempCharTwo = twoCategory == 7 ? charTwo + 32 : charTwo;
if (tempCharOne != tempCharTwo) {
return tempCharOne > tempCharTwo;
}
else {
return oneCategory > twoCategory;
}
}
}
}
return [nameOne localizedCaseInsensitiveCompare:nameTwo];
}];
return newArray;
}
- (short)getCharCategory:(unichar)character {
if (character > 255) { // emoji
return 0;
}
NSCharacterSet *letterCaseCharSet = [NSCharacterSet letterCharacterSet];
if ([letterCaseCharSet characterIsMember:character]) return 1;
NSCharacterSet *decimalDigitCharSet = [NSCharacterSet decimalDigitCharacterSet];
if ([decimalDigitCharSet characterIsMember:character]) return 2;
NSCharacterSet *punctuationCharSet = [NSCharacterSet punctuationCharacterSet];
if ([punctuationCharSet characterIsMember:character]) return 3;
NSCharacterSet *symbolCharSet = [NSCharacterSet symbolCharacterSet];
if ([symbolCharSet characterIsMember:character]) return 4;
return 5;
}
- (short)getLetterCategory:(unichar)character {
NSCharacterSet *lowerCaseCharSet = [NSCharacterSet lowercaseLetterCharacterSet];
if ([lowerCaseCharSet characterIsMember:character]) return 6;
return 7;
}
关于ios - 使用 NSComparisonResult 将 NSArray 排序为特定序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30814834/
在我的 iOS 应用程序中,我实现了一个来自核心数据的表格 View 和一个搜索栏。在当前状态下,搜索只显示以搜索字符串开头的字段,但我想要的是显示包含至少三个字符长度的搜索文本的字段。 这是我的搜索
我的应用程序正在比较发送到函数的请求字符串,例如 -(void)sendSearchRequest:(NSString *)request sport:(NSString *)sport locati
我将 NSComparisonResult 与我的 SearchController 一起使用: for (Annotation *ano in listContent) { NSCo
我使用 NSComparisonResult 搜索数组,但是当我使用 NSDiacriticInsensitiveSearch 时,它无法立即找到 å æ ø 等斯堪的纳维亚字母,但它可以找到 á 等
当我在搜索字段中输入两个以上的字符时会引发异常。我使用 NSComparisonResult 在 UITableView 上显示结果: - (void)filterContentForSearchTe
我需要在 Swift 中比较两次并使用 NSComparisonResult 我可以获得正确的结果,直到晚上 10 点到晚上 11:59 之间的时间。这些时间显示相反的结果。任何人都知道这是什么问题?
我有一个基于 Swift 的 iOS 应用程序。我正在尝试使用 Swift 排序方法之一按“createdAt”NSDate 属性对我的对象数组进行排序。 我的数组有一堆 PFObject - 这些对
什么是 NSComparisonResult 和 NSComparator? 我见过其中一种类型定义,类似这样: typedef NSComparisonResult (^NSComparator)(
我正在使用此代码在我的表格 View 中进行搜索: for (Actor *actorz in arr) { NSComparisonResult result = [actorz.
我正在使用此代码在我的表格 View 中进行搜索: for (Actor *actorz in arr) { NSComparisonResult result = [actorz.
我的目的是让从 "1927-2-2" 到 "1928-1-22" 的每个日期在输入 UIDatePicker 时都调用图像。我可以用除“1928-1-22”之外的每个日期成功调用图像,这是唯一不产生图
我正在尝试使用 NSComparisonResult 按特定顺序对我的数组进行排序。我无法弄清楚如何实现我想要的序列。 我正在尝试将表情符号置于顶部(表情符号的顺序无关紧要),然后是 A-Z 字母,在
我有一段代码对点的 NSMutableArray 进行排序,如下所示: [points sortUsingComparator:^NSComparisonResult (id firstObject,
NSDecimalNumber *no1 = [NSDecimalNumber decimalNumberWithString:[totalPotFund stringByReplacingOc
我有这个 distanceSorter.h/distanceSorter.m: @interface CLLocation (DistanceComparison) - (NSComparisonRe
我是一名优秀的程序员,十分优秀!