我可以使用字符的 HashMap 代替 String 吗?
Can I use HashMap of characters in place of String?
我想要一个函数来从输入的字符构建一个字符串,并在它获得它包含的输入字符时停止构建。
我知道我可以为此使用 String.contains()
但我正在学习 HashMaps 并且想知道是否有更快的方法可以将输入的字符存储在 HashMap 中并使用 HashMap.contains()
方法。
HashMap::containsKey
是 O(1), String::contains
is not。实现可能会根据 JVM 版本而改变,但它更像是 O(n)。
所以是的,使用 HashMap
查找值应该 更快 (在小数据上你可能不会注意到差异)比调用String::contains
。但是一个Map存储一个键和一个值,如果你不关心值,你可以使用一个Set
(注意,所有的值在这种集合中都是唯一的)因为Set::contains
是 O(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
但是如果你真的想使用 HashMap
的 key
/ 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
我想要一个函数来从输入的字符构建一个字符串,并在它获得它包含的输入字符时停止构建。
我知道我可以为此使用 String.contains()
但我正在学习 HashMaps 并且想知道是否有更快的方法可以将输入的字符存储在 HashMap 中并使用 HashMap.contains()
方法。
HashMap::containsKey
是 O(1), String::contains
is not。实现可能会根据 JVM 版本而改变,但它更像是 O(n)。
所以是的,使用 HashMap
查找值应该 更快 (在小数据上你可能不会注意到差异)比调用String::contains
。但是一个Map存储一个键和一个值,如果你不关心值,你可以使用一个Set
(注意,所有的值在这种集合中都是唯一的)因为Set::contains
是 O(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
但是如果你真的想使用 HashMap
的 key
/ 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