我按字母顺序按姓氏排序数组。我想把它分成几个部分,在每个部分(A,B,C等)上方有适当的标题。
以下是我在下面尝试过的内容:
double res,x,t1,t2,t3,temp;
char num[10],t4[20],disp[50],c;
GetWindowText(box2,num,11);
ifstream inFile;
temp=atoi(num);
inFile.open("product.txt");
while(!inFile.eof())
{
inFile>>x;
inFile>>t4;
inFile>>t3;
inFile>>t2;
inFile>>t1;
cout<<x;
if(x==temp)
{
sprintf(disp,"\tId: %.0lf\t\n\tName: %s\t\n\tSale Price: %.0lf\t\n\tDiscount %.2lf\t\n\tProduct Added to Cart",x,t4,t2,t1);
MessageBox(hwnd2,disp, "Product Info", MB_OK);
break;
}
}
inFile.close();
更新:
这让我更接近我想要的东西。
数据正在加载,正在正确分组并显示标题。
但它不是按字母顺序排列的。
如何改进此代码以按字母顺序显示?
它在我的控制台中按字母顺序显示,而不是在应用程序中。
答案 0 :(得分:0)
根据定义,NSMutableDictionary无序。如果依赖于存储对象的顺序,这不是自然的选择。我建议你改用NSMutableArray。要存储每个部分的tableview数据,您可以使用此迷你类
@interface MembersWithSameInitial : NSObject
@property (strong) NSString* initial;
@property (strong) NSMutableArray<PCMSMember*>* members;
@end
@implementation MembersWithSameInitial
@end
对成员进行排序后,可以在tableView重新加载之前使用此方法生成tableview的所有数据。
NSMutableArray<MembersWithSameInitial*>* groupedMembers = [[NSMutableArray alloc] init];
for (PCMSMember* member in sortedArray) {
NSString* inicial = [member.lastName substringToIndex:1];
MembersWithSameInitial* last = [groupedMembers lastObject];
if (last && [last.initial isEqualToString:inicial]) {
[last.members addObject:member];
} else {
MembersWithSameInitial* newGroup = [[MembersWithSameInitial alloc] init];
newGroup.initial = inicial;
newGroup.members = [[NSMutableArray alloc] initWithObjects:member, nil];
[groupedMembers addObject:newGroup];
}
}
由于groupedMembers
的结构适合分组的tableView,因此dataSource方法将具有简单的实现。假设您已将groupedMembers
存储在属性中。
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return self.groupedMembers.count;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.groupedMembers[section].members.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
//...
PCMSMember *currentMember = self.groupedMembers[indexPath.section].members[indexPath.row];
//...
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
return groupedMembers[section].initial;
}
答案 1 :(得分:0)
建议:
创建两个属性
@property NSMutableArray *keys; // for the letters in alphabetical order
@property NSMutableDictionary *indexedContacts; // same as your implementation.
在方法refreshData
中调用方法来创建数据源,然后在主线程上重新加载表视图。
实际上,您不再需要属性memberArray
和sortedArray
。已排序的数组将传递给方法以创建数据源。
- (void)refreshData {
[[PCMSSessionManager sharedSession] refreshPCMSDataWithCompletion:^(BOOL success, NSString *errorMessage, id resultObject) {
if (success) {
NSLog(@"yay!");
self.membersArray = [[PCMSSessionManager sharedSession] memberArr];
// Let's sort the array
NSArray *sortedArray = [self.membersArray sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
NSString *first = [(PCMSMember*)a lastName];
NSString *second = [(PCMSMember*)b lastName];
return [first compare:second];
}];
[self indexMembers:sortedArray];
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
} else {
NSLog(@"boooo!!!!");
}
}];
}
方法indexMembers
初始化属性keys
和indexedContacts
并创建数据源。
- (void)indexMembers:(NSArray *)sortedMembers
{
self.keys = [[NSMutableArray alloc] init];
self.indexedContacts = [[NSMutableDictionary alloc] init];
for (PCMSMember *member in sortedMembers)
{
NSString *sortString = member.lastName;
NSString *sortLetter = [sortString substringToIndex:1];
/* see if that letter already exists as an index */
NSArray *keyArray = self.indexedContacts[sortLetter];
NSMutableArray *valueArray;
if (keyArray) {
// array for key exists, use it
valueArray = [keyArray mutableCopy];
} else {
// array for key does not exist, create a new one
valueArray = [NSMutableArray new];
// and add the letter to keys
[self.keys addObject:sortLetter];
}
[valueArray addObject:member];
self.indexedContacts[sortLetter] = [valueArray copy];
}
}
numberOfSectionsInTableView
返回键数
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return self.keys.count;
}
numberOfRowsInSection
获取给定部分的相应数组并返回项目数。
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
NSString *letter = self.keys[section];
NSArray *memberArray = self.indexedContacts[letter];
return memberArray.count;
}
在cellForRowAtIndexPath
中使用方法dequeueReusableCellWithIdentifier: forIndexPath:
始终获得有效的单元格。然后在numberOfRowsInSection
中获取实际的成员数组并填充标签。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *cellIdentifier = @"cellIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];
// Configure the cell...
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
if (self.isPhysician == YES) {
NSString *letter = self.keys[indexPath.section];
NSArray *memberArray = self.indexedContacts[letter];
PCMSMember *currentMember = memberArray[indexPath.row];
cell.textLabel.text = [NSString stringWithFormat:@"%@ %@", currentMember.firstName, currentMember.lastName];
}
return cell;
}
titleForHeaderInSection
只返回
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
return self.keys[section];
}
你打电话给indexedMembers
太多了。这非常昂贵。
我无法测试代码,可能有self
或其他缺失的东西,但您会看到工作流程。