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

时间:2011-01-07 00:04:48

标签: java .net iterator hashtable enumeration

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


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

我有什么方法可以使.NET Hashtable数据与Java Hashtable的顺序相同?

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

以下是一些相同的数据来说明我的情况。

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

  1. num | someData
  2. pagenum | someData
  3. x | someData
  4. top | someData
  5. Java代码:

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

    通过枚举器迭代的Java输出:

    alt text

    .NET代码:

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

    .NET输出通过枚举器迭代。

    alt text

    有任何想法或建议吗?

7 个答案:

答案 0 :(得分:8)

不幸的是,如果没有更改集合的类型,那么真的没办法解决这个问题。 Hashtables不保证订单(正如您在帖子中提到的那样)。

这一切归结为以下几点:

如果订单很重要,则Hashtable是错误的数据结构。

答案 1 :(得分:3)

除了提取密钥并以某种方式对其进行排序(或使用有序字典)之外,您无法更改此顺序。您未使用任何哈希表实现的迭代顺序,因此依赖于特定顺序意味着您的代码被破坏。 Java中的迭代顺序甚至不保证保持不变JDK的未来版本。

答案 2 :(得分:2)

通用散列表中的顺序是不可预测的。这就是你所经历的。如果您尝试运行比较测试,并且需要特定订单,则必须在 BOTH 两端使用有序地图。否则几乎没有办法预测输出。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:1)

这是一个糟糕的解决方案,但根据您的描述,您没有其他选择。

您可以获取Java Hastable类的源代码并将它们移植到C#。删除所有不必要的东西,比如迭代器和keySetequals,你将拥有相当小的类(我期望的几十行)。将它转换为C#应该是微不足道的。

当然,除了Java兼容性之外,不应该将此新类用于其他任何内容。并向原始应用程序供应商提交错误也可能很好:)

答案 6 :(得分:0)

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