[英]How to make a .NET Hashtable work just like a Java Hashtable
當我將某些項目添加到Java Hashtable
,它們的順序與.NET Hashtable
的順序不同。 有什么方法可以確保.NET Hashtable
與Java Hashtable
具有相同的順序?
我正在嘗試將一些Java代碼移植到C#。 Java代碼使用Hashtable
來跟蹤某些數據。 當我查看通過Java Hashtable
或.NET Hashtable
(通過Enumerator
)進行迭代時,檢索數據的順序時,每個數據始終以相同的順序具有相同的數據...但是每個基於代碼的都有不同的順序。
有什么辦法可以使.NET Hashtable
數據與Java Hashtable
處於相同順序?
我了解Hashtable
不處理排序-因此我覺得無能為力。 我也無法將Java代碼中的數據類型從..例如.. Hashtable
更改為其他內容。
這是一些相同的數據來說明我的情況。
private Hashtable identifiers = new Hashtable();
...
identifiers.put(symbol, identifier);
private Hashtable Identifiers = new Hashtable();
...
Identifiers.Add(symbol, identifier);
有什么想法或建議嗎?
不幸的是,除了改變集合的類型,實際上沒有辦法解決這個問題。 哈希表不保證順序(如您在帖子中所述)。
歸結為以下幾點:
如果順序很重要,則哈希表是錯誤的數據結構。
您不能以提取鍵並以某種方式(或使用有序字典)對鍵進行排序的方式更改此順序。 沒有指定您使用的任何哈希表實現的迭代順序,因此依賴特定順序意味着您的代碼已損壞。 Java的迭代順序甚至不能保證在JDK的未來版本中保持不變。
通用哈希表中的順序是不可預測的。 那就是你所經歷的。 如果你正在嘗試運行對比測試,如果你需要特定的順序,你必須使用兩端序映射。 否則,幾乎沒有辦法預測輸出。
我同意其他答案,但是仍然不推薦使用Hashtable。 您應該始終使用通用的Dictionary類。 還有一個SortedDictionary,類名全部說明。 您可以對它的內容進行反向或排序,請看這里.NET中的反向排序字典
你可以使用Java中的LinkedHashMap的和遞歸軟件使一個可用於C#按這個帖子 。
我還沒有嘗試過這種解決方案。
這是一個糟糕的解決方案,但是根據您的描述,您別無選擇。
您可以獲取Java Hastable
類的源並將其移植到C#。 剝離所有不必要的東西,例如iterators和keySet
, equals
,您將擁有非常小的類(我希望能打幾行)。 將其轉換為C#應該很簡單。
自然,除了Java兼容性之外,您不應將此新類用於任何其他用途。 向原始應用程序供應商提交錯誤可能也不錯:)
您可以嘗試在.NET中實現自己的IHashCodeProvider和IComparer並將它們傳遞給Hashtable構造函數。 從您發布的示例中可以看出,條目是按鍵的升序(.NET)和降序(Java)順序排序的,因此您需要一個將順序反轉的比較器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.