【发布时间】:2020-03-27 14:25:57
【问题描述】:
我正在尝试学习 Java,并得到了一个练习,即获取字符串中的第一个唯一项。 我使用 HashTable 作为字符串的字符作为键和计数器在字符串中被看到的次数作为值。
之后,我将遍历 HashTable 并检查每个键的值是否为 1(只见过一次)我想返回它。
问题是,当我有这样的字符串时,例如 abcdcd a 和 b 都是唯一的,但 a 是第一个,但由于某种原因,当我得到哈希表上的键时, b 在 a 之前。
这就是我所拥有的:
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.Hashtable和Enumeration是古老的类,已被集合框架中的HashMap和Iterator有效取代,如果您的课程/学习来源将您指向Hashtable,那么它几乎可以肯定是古老的并且应该是避免。 -
Hashtable和HashMap使用键hashCode()将条目放入存储桶中。如果您需要迭代顺序来匹配插入顺序,请使用LinkedHashMap。HashMap应优先于Hashtable使用(并且Iterator优于Enumeration)。这段代码看起来旧。 -
HashTable(或者更好的 HashMap)中的顺序是从不保证的。如果要在保留插入顺序的集合中使用散列功能,请使用 LinkedHashMap。如果要排序,请使用 TreeMap。
标签: java