【问题标题】:How to make a .NET Hashtable work just like a Java Hashtable如何使 .NET Hashtable 像 Java Hashtable 一样工作
【发布时间】:2011-06-05 00:19:05
【问题描述】:

当我将一些项目添加到 Java Hashtable 中时,它们的顺序与 .NET Hashtable 的顺序不同。有什么方法可以确保 .NET Hashtable 与 Java Hashtable 具有相同的顺序?


我正在尝试将一些 Java 代码移植到 C#。 Java 代码使用Hashtable 来跟踪一些数据。当我检查 order 时,当我遍历 Java Hashtable 或 .NET Hashtable(通过 Enumerator)时,数据被检索到,每个都始终具有相同的数据, 以相同的顺序...但是每个基于代码的 有不同的顺序。

有什么办法可以让 .NET Hashtable 数据与 Java Hashtable 的顺序相同?

我知道Hashtable 不处理订单 - 所以我觉得没有什么可以做的。我也无法将 Java 代码中的数据类型从 .. say .. a Hashtable 更改为其他内容。

这里有一些相同的数据来说明我的情况。

数据,为任一代码库添加顺序:-

  1. 号码 |一些数据
  2. 页码 |一些数据
  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 和 .NET 都没有保证。
  • 您在移植过程中是否确定顺序很重要?
  • @Nikita Rybak - 不幸的是,这很关键。 Java 代码遍历每个键并用单个字符替换数据值。例如。第一个数据值“x”变为“a”。第二个数据值“pagenum”变为“b”。在 c# 代码中,“pagenum”是“c”,“x”是“d”。 :( 代码仍然有效,只是结果现在不相同了。

标签: java .net iterator hashtable enumeration


【解决方案1】:

您可以尝试(在 .NET 中)实现您自己的 IHashCodeProvider 和 IComparer 并将它们传递给 Hashtable 构造函数。 从您发布的示例看来,条目按键升序(.NET)和降序(Java)顺序排序,因此您需要一个反转顺序的比较器。

【讨论】:

    【解决方案2】:

    这是一个糟糕的解决方案,但根据您的描述,您别无选择。

    您可以获取 Java Hastable 类的源代码并将它们移植到 C#。去掉所有不必要的东西,比如迭代器和keySetequals,你会有一个非常小的类(我希望只有几十行)。将其转换为 C# 应该很简单。

    当然,您不应该将这个新类用于 Java 兼容性以外的任何其他用途。向原始应用程序供应商提交错误也可能很好:)

    【讨论】:

      【解决方案3】:

      通用哈希表中的顺序是不可预测的。这就是你正在经历的。如果您尝试运行比较测试并且需要特定顺序,则必须在 BOTH 端使用有序映射。否则几乎没有办法预测输出。

      【讨论】:

        【解决方案4】:

        您可以在 Java 中使用 LinkedHashMap,递归软件根据this post 为 C# 提供了一个。

        我没有尝试过这个解决方案。

        【讨论】:

          【解决方案5】:

          我同意其他答案,但仍然不推荐使用 Hashtable。您应该始终使用通用 Dictionary 类。还有一个 SortedDictionary,类名说明一切。你可以反转或排序它的内容,看看这里Reverse Sorted Dictionary in .NET

          【讨论】:

          • Java 中的 SortedDictionary 等价物是什么?排序地图?
          • 哈希表未被弃用。有一个更好的选择,但它没有被弃用。尽管大多数时候您需要 Dictionary`2,但在符合要求的情况下使用 Hashtable 并没有错。它只是一个字典。另外,你怎么知道这不是 .NET 1.0 或 1.1?那时还没有字典。
          【解决方案6】:

          不幸的是,除了改变集合的类型之外,真的没有办法解决这个问题。哈希表不保证顺序(正如您在帖子中提到的那样)。

          归结为以下几点:

          如果顺序很重要,Hashtable 是错误的数据结构。

          【讨论】:

            【解决方案7】:

            除了提取键并以某种方式(或使用有序字典)对它们进行排序之外,您无法更改此顺序。您使用的任何一个哈希表实现的迭代顺序都未指定,因此依赖特定顺序意味着您的代码已损坏。 Java 中的迭代顺序甚至不能保证在JDK 的未来版本。

            【讨论】:

            • 实际上,如果你覆盖散列算法,你可以;)但这当然不能解决原来的问题。
            • Schultz999:不,你不能,因为哈希码和哈希表的“顺序”之间没有保证的关系。
            猜你喜欢
            • 2010-11-15
            • 2011-02-05
            • 2012-07-27
            • 2019-05-02
            • 2011-01-04
            • 2018-02-17
            • 1970-01-01
            • 1970-01-01
            • 2019-02-25
            相关资源
            最近更新 更多