[英]Java's TreeMap replacement in Objective-C?
我正在将要移植到ios(objective-c)的Java代码中使用TreeMap
。 它应该与Java原始版本一样高效.subMap()
至少要获取.subMap()
)。 为此,在Objective-C / Foundation中是否有任何现有的类? 是否存在任何现有的第三方库?
编辑:
看一下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
第三方实现。
因此,您需要自行重建此功能。 一些指南:
NSDictionary
子类化以创建有序字典,有一篇不错的文章。 它已经很老了(在ARC之前的日子),但是API和概念从那以后就没有改变(当然,除了ARC)。 [myDict allKeys]
查询字典的键,然后可以对其排序并从中获取键范围。 然后,您可以创建一个新的可变字典并复制相关的键/值。 [myDict mutableCopy]
并删除使用所有不需要的钥匙-[NSMutableDictionary removeObjectsForKeys:]
。 顺便说一句,请注意,与Java不同,Objective-C不允许您选择实现,而是在运行时为您自动选择的。 这就是为什么只有两类可供选择:不可变的NSDictionary
和可变的NSMutableDictionary
。
最终,我能够使用M13MutableOrderedDictionary
存储排序的字典,并使用其他NSMutableIndexSet
存储排序的键(您应该在字典和索引集之间同步更改)来做到这一点。 为了获得subMap(from, to)
应该使用NSMutableIndexSet方法找到最接近的现有值:
indexGreaterThanOrEqualToIndex
indexLessThanIndex
它们帮助您根据/到限制来查找现有键,并使用M13MutableOrderedDictionary的方法subOrderedDictionaryWithRange
获得subMap
。
用于存储其他键索引的开销,但是还是可以的。 在Objective-C中找不到更好的方法,任何改进都值得赞赏。 感谢DarkDust 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.