我可以使用字符的 HashMap 代替 String 吗?

Can I use HashMap of characters in place of String?

我想要一个函数来从输入的字符构建一个字符串,并在它获得它包含的输入字符时停止构建。

我知道我可以为此使用 String.contains() 但我正在学习 HashMaps 并且想知道是否有更快的方法可以将输入的字符存储在 HashMap 中并使用 HashMap.contains()方法。

HashMap::containsKeyO(1), String::contains is not。实现可能会根据 JVM 版本而改变,但它更像是 O(n)。

所以是的,使用 HashMap 查找值应该 更快 (在小数据上你可能不会注意到差异)比调用String::contains。但是一个Map存储一个键和一个值,如果你不关心值,你可以使用一个Set(注意,所有的值在这种集合中都是唯一的)因为Set::containsO(1).


正如评论中提到的@n247s。除非你真的有性能问题,否则 String::contains 应该可以正常工作并使代码更易于阅读。

HashMap<>只是一个扩展了Map<>接口的class,你可以使用containsKey()containsValue()。如果你想遍历HashMap中的值,你可以使用HashMaps.values()方法和concat/add字符串的值。

未测试:

int count = -1;
String new = "";
for (char c : map.values()) {
    count++;
    if (string.charAt(count).equals(c))
      break;
    new.concat(c);
}

Set 是一个很好的数据结构,可以在这里使用。

不过请注意一件事,

如果您需要 case-sensitive 搜索,则可以使用 HashSet。 例子

Set<String> set = new HashSet<>();

否则,如果您需要 case-insensitive 搜索,则 TreeSet。 例子

Set<String> set = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);

如果您不关心插入顺序,最好的方法是使用 Set,但如果您这样做,则应该使用 LinkedHashSet,这将使您的角色保持在插入顺序。

这是 LinkedHashSet 文档的 link。 https://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashSet.html

但是如果你真的想使用 HashMapkey / value 对,你确实可以使用 HashMap<Character, Character>,那么你可以检查 map.containsKey() O(1)map.containsValue() O(n) 请记住,因为 containsValue() 将使用 O(n),在这种情况下最好只检查 String::contain。如果您关心广告顺序,还有一个 LinkedHashMap 可以为您做到这一点。 Link 给下面的文档 https://docs.oracle.com/javase/8/docs/api/java/util/LinkedHashMap.html