如何对包含数字和字符的字符串数组进行排序?我的tableView中包含此数据:
- (void)viewDidLoad {
[super viewDidLoad];
self.tableData = [NSMutableArray array];
[self.tableData addObject:@"28 days"];
[self.tableData addObject:@"29 weeks"];
[self.tableData addObject:@"3 days"];
[self.tableData addObject:@"10 years"];
[self.tableData addObject:@"4 months"];
[self.tableData addObject:@"3 Weeks"];
[self.tableData addObject:@"27 Years"];
[self.tableData addObject:@"1 months"];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"Sort" style:UIBarButtonItemStyleBordered target:self action:@selector(sort)];}
我想用一个自然的"方式,天来的第一天,然后是几周,几个月等,同时2天就在5天之前等等。这可能吗?或者我是否必须创建数周,数月,数年等单独的数组?
这是我使用的代码:
- (void)sort {
NSSortDescriptor *sorter = [[NSSortDescriptor alloc]initWithKey:nil ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)];
NSArray *sortArray = [NSArray arrayWithObject:sorter];
NSArray *sortedArray = [self.tableData sortedArrayUsingDescriptors:sortArray];
[self.tableData removeAllObjects];
[self.tableData addObjectsFromArray:sortedArray];
[self.tableView reloadData];}
虽然这并没有解决数字问题,但是以某种方式甚至没有以正确的方式对数据进行排序^^
答案 0 :(得分:5)
如果您创建了一个自定义类来保存字符串而不是将它们直接放入数组中,那将会有所帮助。然后,除了保存字符串之外,此自定义类还可以保留持续时间的数值。这个数值可以用来轻松排序,也可以在用户选择和用户选择的使用方面为您提供帮助。
或者,您可以使用其中一种排序方法,例如sortedArrayUsingComparator:
,并提供代码来检查字符串中的文本和数字内容,并计算出顺序(这不是那么容易)。
答案 1 :(得分:2)
如果我理解正确的话,你想要以最短的持续时间是最长的,最后的最长的方式排序。您需要自己解析字符串以获取天数,周数,月数和年数,计算总天数并使用此数字作为自定义排序方法中的排序键。
答案 2 :(得分:2)
假设1周= 7天,1个月= 30天,1年= 365天 - 这意味着5周> 1个月 - 这可能是一个解决方案,尽管它在日历数学方面不太正确。
它使用字典作为地图表,分隔数值和日历单位,并分别计算要比较的数值。
NSDictionary *mapTable = @{@"ays" : @1, @"eks" : @7, @"ths" : @30, @"ars" : @365};
self.tableData = [NSMutableArray array];
[self.tableData addObject:@"28 days"];
[self.tableData addObject:@"29 weeks"];
[self.tableData addObject:@"3 days"];
[self.tableData addObject:@"10 years"];
[self.tableData addObject:@"4 months"];
[self.tableData addObject:@"3 Weeks"];
[self.tableData addObject:@"27 Years"];
[self.tableData addObject:@"1 months"];
[self.tableData sortUsingComparator:^NSComparisonResult(NSString *str1, NSString *str2) {
NSArray *components1 = [str1 componentsSeparatedByString:@" "];
NSArray *components2 = [str2 componentsSeparatedByString:@" "];
NSInteger faktor1 = [[mapTable objectForKey:[components1[1] substringFromIndex:[components1[1] length] - 3]] integerValue];
NSInteger faktor2 = [[mapTable objectForKey:[components2[1] substringFromIndex:[components2[1] length] - 3]] integerValue];
return ([components1[0] integerValue] * faktor1) > ([components2[0] integerValue] * faktor2);
}];
[self.tableView reloadData];
答案 3 :(得分:1)
我相信更简单,更灵活的解决方案是不将对象存储为字符串。您的对象似乎表示日期或时间间隔,您可以将其存储在数组中作为NSDate *或NSNumber *(NSTimeInterval)。在NSDate的情况下,您的排序变得简单:
$(document).ready(function() {
$("#loginlink").click(function(){
$("#logindiv").css("display","block");
});
显示您的数据然后变成一个简单的NSDateComponents / NSDateFormatter问题:How do I break down an NSTimeInterval into year, months, days, hours, minutes and seconds on iPhone?