在Objective-C中替换Java的TreeMap?

时间:2014-07-24 13:16:43

标签: java ios objective-c xcode

我在java代码中使用TreeMap,它将被移植到ios(objective-c)。它应该与java的原始效率一样高效(至少获得 .subMap() s )。 Objective-C / Foundation中是否有现有的课程?任何现有的第三方图书馆如果缺席?

3 个答案:

答案 0 :(得分:1)

试试这个旧的cocoa-sorted-dictionary库。

SortedDictionary *dict = [MutableSortedDictionary dictionary];

[dict setValue: @"red"    forKey: @"apple"];
[dict setValue: @"yellow" forKey: @"banana"];
[dict setValue: @"orange" forKey: @"orange"];

NSString *color = [dict objectForKey: @"apple"];

您可以通过阅读此documentation

来检查这个是否真的是您想要的

答案 1 :(得分:0)

修改

看看M13OrderedDictionary。这允许您使用subOrderedDictionaryWithRange:生成新的有序词典,大致相当于subMap(您必须自己确定范围)。

你可以这样做:

// NSArray *allKeys = [orderedDict allKeys];
// NSUIndex from = [allKeys indexOfObject:fromObject];
// NSUIndex to = [allKeys indexOfObject:toObject];

NSUInteger from = [orderedDict indexOfKey:fromObject];
NSUInteger to  = [orderedDict indexOfKey:fromObject];

if (from != NSNotFound && to != NSNotFound) {
    M13OrderedDictionary *newDict = [orderedDict subOrderedDictionaryWithRange:NSMakeRange(from, to-from)];
}

旧回答:

Java TreeMap是一个有序地图(Java用语)或字典(Objective-C用语)。没有本机Objective-C等价物,我不知道任何类似subMap的第三方实现。

因此,您需要自己重建此功能。一些指南:

  • subclassing NSDictionary to create an ordered dictionary上有一篇很好的文章。这是相当古老的(ARC之前的日子),但API和概念从那以后没有改变(当然除了ARC)。
  • 您可以使用[myDict allKeys]查询字典的键,然后您可以对其进行排序并获取您的键范围。然后,您可以创建一个新的可变字典并复制相关的键/值。
  • 或者,您创建了键范围的反转(也就是说,您创建了想要保留的键的数组),然后执行[myDict mutableCopy]并删除所有键使用-[NSMutableDictionary removeObjectsForKeys:]的不需要的密钥。
BTW,请注意,与Java不同,Objective-C不允许您选择实现,它会在运行时自动为您选择。这就是为什么只有两个类可供选择:不可变的NSDictionary和可变的NSMutableDictionary

答案 2 :(得分:0)

最后,我能够使用M13MutableOrderedDictionary来存储已排序的字典,并使用额外的NSMutableIndexSet来存储已排序的键(您应该在字典和索引集之间进行同步更改)。要获得subMap(from, to),应使用NSMutableIndexSet方法找到最接近的现有值:

  • indexGreaterThanOrEqualToIndex
  • indexLessThanIndex
  • ...

它们可以帮助您根据自/到限制查找现有密钥,并使用M13MutableOrderedDictionary的方法subMap获取subOrderedDictionaryWithRange

用于存储附加键索引的开销,但无论如何都可以。没有更好的方法在Objective-C中找到它,任何改进都值得赞赏。感谢 DarkDust