繁体   English   中英

在Objective-C中替换Java的TreeMap?

[英]Java's TreeMap replacement in Objective-C?

我正在将要移植到ios(objective-c)的Java代码中使用TreeMap 它应该与Java原始版本一样高效.subMap()至少要获取.subMap() )。 为此,在Objective-C / Foundation中是否有任何现有的类? 是否存在任何现有的第三方库?

试试这个旧的可可分类词典库。

SortedDictionary *dict = [MutableSortedDictionary dictionary];

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

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

您可以通过阅读本文档来检查这一需求是否实现

编辑:

看一下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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM