1

我认为在字典中查找对象是否会更简单,但似乎不是。

我有一个 NSMutableDictionary,只有一个名为“products”的键。

我有几个产品动态添加到字典中,使用类似的东西

[myDict addObject:@"banana" forKey:@"products"];
[myDict addObject:@"orange" forKey:@"products"];
[myDict addObject:@"grapes" forKey:@"products"];

等等

在某些时候,我想知道,例如,香蕉是否在字典中。

有没有办法做到这一点?我的意思是,只是想知道一个对象是否在字典上?

谢谢你的帮助。

4

3 回答 3

7

您误解了字典的工作原理。字典为单个键存储单个值。因此,在您的代码运行后,将保存一个键值对:=> 。如果您需要一个键来指向多个对象,那么您的键将需要指向一个(或者如果您不关心顺序),然​​后您从而不是从字典中添加和删除事物。myDict@"products"@"grapes"NSMutableArrayNSMutableSetNSMutableArray

如果这将成为您字典中所有内容的基本结构,您可能需要考虑为您的字典制作一个包装器,如下所示:

//DDMutableMultiValueDictionary.h
@interface DDMutableMultiValueDictionary : NSObject {
  NSMutableDictionary * dict;
}

- (void) addObject:(id)value forKey:(id)key;
- (void) removeObject:(id)value forKey:(id)key;
- (BOOL) containsObject:(id)value forKey:(id)key;

@end

//DDMutableMultiValueDictionary.m
#import "DDMutableMultiValueDictionary.h"

@implementation DDMutableMultiValueDictionary

- (id) init {
  if (self = [super init]) {
    dict = [[NSMutableDictionary alloc] init];
  }
  return self;
}

- (void) dealloc {
  [dict release];
  [super dealloc];
}

- (void) addObject:(id)value forKey:(id)key {
  NSMutableArray * values = [dict objectForKey:key];
  if (values == nil) {
    values = [NSMutableArray array];
    [dict setObject:values forKey:key]
  }
  [values addObject:value];
}

- (void) removeObject:(id)value forKey:(id)key {
  NSMutableArray * values = [dict objectForKey:key];
  [values removeObject:value];
}

- (BOOL) containsObject:(id)value forKey:(id)key {
  NSMutableArray * values = [dict objectForKey:key];
  return [values containsObject:value];
}

@end

这无论如何都不完整,但它让您了解如何制作它。

于 2009-10-18T16:49:46.207 回答
2

你可以把任何你想要的东西作为对象。如果对象不在字典中,则使用 objectForKey 将返回nil,如果在字典中,将返回对象。你可以像这样使用它:

[myDict addObject:@"WHATEVER YOU WANT" forKey:@"banana"];
[myDict addObject:@"WHATEVER YOU WANT" forKey:@"orange"];
[myDict addObject:@"WHATEVER YOU WANT" forKey:@"grapes"];
..
..
..
if ([myDict objectForKey:@"banana"]) {
  // I have a banana
} 
if ([myDict objectForKey:@"orange"]) {
  // I have an orange
} 
if ([myDict objectForKey:@"grapes"]) {
  // I have grapes
} 
于 2009-10-18T16:54:58.943 回答
2

我同意其他发帖者的观点,即您可能误解了字典的工作原理。但是如果它很有用,您可以通过以下方式查看特定对象是否作为值存在,以及对于哪些键:

// assume the object you're looking for is in the variable myValue
NSArray *keys = [myDict allKeysForObject:myValue];
if( [keys count] ) {
  // do whatever ...
}
于 2009-10-18T17:06:12.223 回答