【发布时间】:2016-11-18 09:57:36
【问题描述】:
我正在尝试对一些字符串列表进行排序。元素的名称几乎可以是任何东西,包括真实姓名、字符串、日期……和数字。
我发现NSStringCompareOptions 和NSNumericSearch,工作速度足够快,而且效果很好,所以:
[1,2,21,3,55,6] --> [1,2,3,6,21,55]
但我的问题是负数
[1,2,3,-1,-4,-5] --> [-1,-4,-5,1,2,3]
哪里不对。
我知道苹果会留下来:
Numeric comparison only applies to the numerals in the string,
not other characters that would have meaning in a numeric representation
such as a negative sign, a comma, or a decimal point.
但我的问题是如何实现这一点,因为我知道我不仅是这样做的人。
编辑:
感谢 Narendra Pandey,但我的真实案例有点复杂,所以这里不能使用他的答案。
假设我有一些字典,其中数字作为键,字符串作为值:
dic = {@1:@"123", @2:@"-123", @5:"MyName",...};
然后我有一个带有 id 的对象数组。
array = @[{object with id 5}, {object with id 2},...];
我需要按属性名称排序的对象数组。
NSStringCompareOptions comparisonOption = NSCaseInsensitiveSearch | NSNumericSearch;
array = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
NSString * name1 = [dic objectForKey:obj1.someId];
NSString * name2 = [dic objectForKey:obj2.someId];
return [name1 compare:name2 options:comparisonOption];;
}];
编辑 2:
也许我应该说我有解决方案,但它比使用 NSStringCompareOptions 排序慢 4 倍
// CHECK IF IT IS NUMBER
NSNumber * number1 = [numberFormatter numberFromString:string1];
NSNumber * number2 = [numberFormatter numberFromString:string2];
//
// NSLog(@"NUMBERS : %@, %@", number1, number2);
if (number1 && number2) {
return [number1 compare:number2];
}
return [string1 compare:string2 options:comparisonOption];
【问题讨论】:
-
将负数从该数组分离并存储到另一个数组并转换为正数。然后对该数组进行排序并反转它。现在转换为负数并将其连接到旧数组的顶部。
-
负数排序有什么问题?期望的输出是什么?
标签: ios xcode sorting nsstring