【问题标题】:Can I use HashMap of characters in place of String?我可以使用字符的 HashMap 代替 String 吗?
【发布时间】:2022-01-07 19:25:40
【问题描述】:

我想要一个函数来从输入的字符构建一个字符串,如果它得到一个包含的输入字符就停止构建。

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

【问题讨论】:

  • 有趣的想法。我能想到的几个问题: hashmap 默认不维护顺序,所以涉及到很多自定义处理;例如,转换回字符串需要大量开销;你需要很多字符(几千),哈希图才能胜过迭代方法(默认情况下是哪个字符串);当 contains 不被使用的次数非常愚蠢时,首先创建哈希映射字符串所需的额外性能可能不值得
  • 如果你的字符串只有几百个字符,性能就无关紧要了。

标签: java string data-structures hashmap


【解决方案1】:

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

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


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

【讨论】:

    【解决方案2】:

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

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

    但是如果你真的想使用HashMap中的key/value对,你确实可以使用HashMap<Character, Character>,那么你可以使用map.containsKey() O(1)map.containsValue() O(n)进行检查,记住因为containsValue() 将使用O(n),所以在这种情况下最好只检查String::contain。如果您关心广告订单,还有一个LinkedHashMap 可以为您解决问题。链接到下面的文档 https://docs.oracle.com/javase/8/docs/api/java/util/LinkedHashMap.html

    【讨论】:

      【解决方案3】:

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

      不过,请注意一件事,

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

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

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

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

      【讨论】:

        【解决方案4】:

        HashMap只是一个扩展Map接口的类,可以使用containsKey()containsValue ()。如果要循环遍历 HashMap 中的值,可以使用 HashMaps.values() 方法并将值连接/添加到字符串。

        未经测试:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-11
          • 2022-01-23
          • 2015-08-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多