【问题标题】:Hashtable keys get reordered when iterating [duplicate]迭代时哈希表键重新排序[重复]
【发布时间】:2020-03-27 14:25:57
【问题描述】:

我正在尝试学习 Java,并得到了一个练习,即获取字符串中的第一个唯一项。 我使用 HashTable 作为字符串的字符作为键和计数器在字符串中被看到的次数作为值。

之后,我将遍历 HashTable 并检查每个键的值是否为 1(只见过一次)我想返回它。 问题是,当我有这样的字符串时,例如 abcdcd ab 都是唯一的,但 a 是第一个,但由于某种原因,当我得到哈希表上的键时, ba 之前。

这就是我所拥有的:

    public static Character firstNonRepeatedCharacter(String str) {
    Hashtable<Character, Integer> characters = new Hashtable<Character, Integer>();
    char[] charsInString = str.toCharArray();

    for(int i=0; i<charsInString.length; i++){
        if (characters.containsKey(charsInString[i])){
            int counter = characters.get(charsInString[i]);
            counter ++;
            characters.put(charsInString[i], counter);
        }else {
            characters.put(charsInString[i], 1);
        }
    }

    Enumeration<Character> enumeration = characters.keys();
    while(enumeration.hasMoreElements()) {
        Character key = enumeration.nextElement();
        if(characters.get(key) == 1) {
            return key;
        }
    }

    return null;

}

为什么会这样?

【问题讨论】:

  • 1. Hashtable(和大多数其他Map 实现)没有定义它们的顺序,它们只做映射,迭代顺序应该被认为是有效的随机。 2. HashtableEnumeration 是古老的类,已被集合框架中的 HashMapIterator 有效取代,如果您的课程/学习来源将您指向 Hashtable,那么它几乎可以肯定是古老的并且应该是避免。
  • HashtableHashMap 使用键 hashCode() 将条目放入存储桶中。如果您需要迭代顺序来匹配插入顺序,请使用LinkedHashMapHashMap 应优先于 Hashtable 使用(并且 Iterator 优于 Enumeration)。这段代码看起来
  • HashTable(或者更好的 HashMap)中的顺序是从不保证的。如果要在保留插入顺序的集合中使用散列功能,请使用 LinkedHashMap。如果要排序,请使用 TreeMap。

标签: java


【解决方案1】:

HashTable 是一个字典,就像一个 Set,它不介意比较器的任何顺序,也不介意插入顺序...

您必须使用LinkedHashMap,因为它保持与任何 LinkedList 相似的插入顺序。

解决方法: 如果您想使用 yes 或 yes 一个 HashTable,您可以使用键创建一个 List,然后迭代该列表以从 HashTable 中获取值。一个例子:

Hashtable<Character, Integer> characters = new Hashtable<Character, Integer>();
List<Character> list = new LinkedList<>();
[...]
foreach(Character c: list){
 if(characters.get(c) == 1) {
            return c;
  }
}

【讨论】:

    猜你喜欢
    • 2012-12-27
    • 1970-01-01
    • 2016-11-21
    • 2020-11-04
    • 2016-04-29
    • 2012-12-25
    • 2018-07-21
    • 1970-01-01
    • 2016-01-10
    相关资源
    最近更新 更多