【问题标题】:How to implement Perl hashes in objective-c?如何在 Objective-C 中实现 Perl 哈希?
【发布时间】:2011-04-26 17:46:01
【问题描述】:

我浏览了许多站点和教程以及 Apple 文档,但仍未找到解决方案:在我看来,NSArray、NSDictionary 和它们的可变对应物与 Perl 的简单功能完全不同哈希。我当然希望我错了。

我需要:动态键和值的可变结构(1 个键 - 1 个值,就这么简单)!我的意思是,我事先不知道键,我需要轻松检查键是否存在,如果存在则检索值或更新它,如果不存在则输入具有新值的新键。我需要这些值是 floats,而不是对象或数组。完成填充结构后,我需要能够检索键并最终通过检索到的键循环遍历值。

所有这些都可以在 Perl 中通过以下方式轻松完成:

    my %expenses;

    if (exists $expenses{$key}) {
       $expenses{$key} += $amount;
    } else {
       $expenses{$key} = $amount;
    }

[...]

有没有人可以告诉我如何在objective-c中实现类似的东西而不使用原始类型?

非常感谢您的帮助。 法布里奇奥

【问题讨论】:

  • 为什么不能使用NSMutableDictionary?您的代码不会像 Perl 版本那么短,但我相信它可以满足您的所有需求。不幸的是,它也会让你将你的花车包裹在 NSNumber 中。
  • 我以为我不能使用它,我以为我尝试了正确的方法,但我错了,因为这里的另外两张海报向我展示了...我很高兴我错了 :) 谢谢。

标签: objective-c nsarray nsdictionary


【解决方案1】:

Cocoa 和 Core Foundation 集合类通常面向存储对象而不是原始值;像您这样的问题的通常解决方案是将浮点数包装在 NSNumber 对象中。不幸的是,获取和设置对象的语法比 Perl 的更冗长

除此之外,NSMutableDictionary 应该完全符合您的要求。键可以是任何字符串,也可以是任何其他可以复制的对象(即它符合 NSCopying 协议),您可以获得所有键的列表,您可以通过简单地尝试检查字典中是否“存在”键获取相应的值。与您的示例对应的代码可能如下所示:

// NB: there no autovivification in Objective-C. Be sure to initialize this somewhere
// before using it!
NSMutableDictionary *expenses;

if ([expenses objectForKey:key]) {
    // This *could* be done in one statement. But it would be very long, so I split
    // it in two for clarity.
    float currentValue = [[expenses objectForKey:key] floatValue];
    [expenses setObject:[NSNumber numberWithFloat:currentValue + amount] forKey:key];
} else {
    [expenses setObject:[NSNumber numberWithFloat:amount] forKey:key];
}

【讨论】:

  • 您需要添加某种[NSMutableDictionary dictionary] 代码来实例化费用。
  • 谢谢 Anomie,你的回答指向了正确的方向,carrot-top 用他的代码让它变得更加简单,但你们都帮了我很多。谢谢!
  • @carrot-top:呵呵。我在 nota bene 评论中指出了这一点。
  • 我指出 Obj-C 初学者的潜在好处。我相信你非常清楚。 :-)
【解决方案2】:

这行得通:

NSString *key=@"fish";
NSMutableDictionary *expenses = [NSMutableDictionary dictionary];
float amount=22.0;

[expenses setObject:[NSNumber numberWithFloat:amount/2] forKey:key];

if ([expenses objectForKey:key]) {
    [expenses setObject:
         [NSNumber numberWithFloat:
             [[expenses objectForKey:key] floatValue] + amount] forKey:key];
} else {
    [expenses setObject:[NSNumber numberWithFloat:amount] forKey:key];
}

NSLog(@"expenses: %@",expenses);

【讨论】:

  • 好胡萝卜,我可以在这里放什么比调试控制台中的行更好的评论?操作...我不能放那么多字符,但它工作顺利!非常感谢,我一直坚持创建 NSDictionaries 的 NSArray 并且看不到简单的方法。非常感谢!!!
  • 啊...忘了问两个问题:1)amount/2是什么意思? 2)我的键实际上是三个键的组合,我可以使用它们并对它们的任意组合进行搜索吗?我的意思是key1和key2,key1和key2和key3,只有key3等等……?
  • amount/2 只是一个随机数,用于触发 if 子句的第一部分。
猜你喜欢
  • 1970-01-01
  • 2023-04-07
  • 2012-05-27
  • 2017-03-20
  • 2010-09-06
  • 2011-11-22
  • 2020-08-31
  • 1970-01-01
相关资源
最近更新 更多