簡體   English   中英

如何使.NET Hashtable像Java Hashtable一樣工作

[英]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更改為其他內容。

這是一些相同的數據來說明我的情況。

數據,為任一代碼庫順序添加:-

  1. num | 一些數據
  2. pagenum | 一些數據
  3. x | 一些數據
  4. 頂部| 一些數據

Java代碼:

private Hashtable identifiers = new Hashtable();
...
identifiers.put(symbol, identifier);

Java通過枚舉器的迭代輸出:

替代文字

.NET代碼:

private Hashtable Identifiers = new Hashtable();
...
Identifiers.Add(symbol, identifier);

.NET通過枚舉器的迭代輸出。

替代文字

有什么想法或建議嗎?

不幸的是,除了改變集合的類型,實際上沒有辦法解決這個問題。 哈希表不保證順序(如您在帖子中所述)。

歸結為以下幾點:

如果順序很重要,則哈希表是錯誤的數據結構。

您不能以提取鍵並以某種方式(或使用有序字典)對鍵進行排序的方式更改此順序。 沒有指定您使用的任何哈希表實現的迭代順序,因此依賴特定順序意味着您的代碼已損壞。 Java的迭代順序甚至不能保證在JDK的未來版本中保持不變。

通用哈希表中的順序是不可預測的。 那就是你所經歷的。 如果你正在嘗試運行對比測試,如果你需要特定的順序,你必須使用兩端序映射。 否則,幾乎沒有辦法預測輸出。

我同意其他答案,但是仍然不推薦使用Hashtable。 您應該始終使用通用的Dictionary類。 還有一個SortedDictionary,類名全部說明。 您可以對它的內容進行反向或排序,請看這里.NET中的反向排序字典

你可以使用Java中的LinkedHashMap的和遞歸軟件使一個可用於C#按這個帖子

我還沒有嘗試過這種解決方案。

這是一個糟糕的解決方案,但是根據您的描述,您別無選擇。

您可以獲取Java Hastable類的源並將其移植到C#。 剝離所有不必要的東西,例如iterators和keySetequals ,您將擁有非常小的類(我希望能打幾行)。 將其轉換為C#應該很簡單。

自然,除了Java兼容性之外,您不應將此新類用於任何其他用途。 向原始應用程序供應商提交錯誤可能也不錯:)

您可以嘗試在.NET中實現自己的IHashCodeProvider和IComparer並將它們傳遞給Hashtable構造函數。 從您發布的示例中可以看出,條目是按鍵的升序(.NET)和降序(Java)順序排序的,因此您需要一個將順序反轉的比較器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM