2014-07-24 54 views
1

我在將要移植到ios(objective-c)的java代碼中使用TreeMap。它應該和java的原版一樣高效(至少獲得.subMap() s)。 Objective-C/Foundation中是否有任何已存在的類?任何現有的第三方庫如果沒有?Objective-C中的Java的TreeMap替換?

回答

0

最後,我能夠使用M13MutableOrderedDictionary來存儲排序後的字典和額外的NSMutableIndexSet來存儲排序後的鍵(你應該同時在字典和索引集之間進行同步)。爲了得到subMap(from, to)應該使用NSMutableIndexSet方法找到最接近的現有價值:

  • indexGreaterThanOrEqualToIndex
  • indexLessThanIndex
  • ...

他們幫助您根據自/至限制查找現有的密鑰和使用M13MutableOrderedDictionary的方法subOrderedDictionaryWithRange得到subMap

用於存儲其他密鑰索引的開銷,但它仍然有效。沒有更好的方式在Objective-C中找到它,任何改進都會得到讚賞。感謝DarkDust

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

+0

不幸的是,我看不到任何'subMap(from,to)'方法。我可以使用額外的排序數組/集合來存儲排序後的鍵,並跳過使用任何第三方排序的詞典,但是無論如何我需要'sub(from,to)'和'first','last'方法。 – 4ntoine

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:]所有不需要的鑰匙。

順便提一句,請注意,與Java不同,Objective-C不允許您選擇實現,它會在運行時爲您自動選擇。這就是爲什麼只有兩類可供選擇:不可變的NSDictionary和可變的NSMutableDictionary

+0

感謝您的鏈接。但似乎我建議重新發明輪子..在obj-c中沒有現有的實現真的嗎? – 4ntoine

+0

那麼,在那裏_are_有序的字典實現,例如[這一個](https://github.com/Marxon13/M13OrderedDictionary)或[這一個](https://github.com/rhodgkins/RDHOrderedDictionary)。肯定還有更多。但是我還沒有看到有'subMap'功能的人。 – DarkDust

+0

好的,無論如何。任何人? – 4ntoine