簡體   English   中英

我可以使用字符的 HashMap 代替字符串嗎?

[英]Can I use HashMap of characters in place of String?

我想要一個 function 來從輸入的字符構建一個字符串,如果它獲得包含的輸入字符,則停止構建。

我知道我可以為此使用String.contains()但我正在學習 HashMaps 並且想知道是否有一種更快的方法可以將輸入的字符存儲在 HashMap 中並使用HashMap.contains()方法。

HashMap::containsKeyO(1)String::contains 不是 該實現可能會改變 JVM 版本的依賴關系,但它更像是 O(n)。

所以是的,使用HashMap查找值應該比調用String::contains更快(在小數據上你可能不會注意到差異)。 但是一個 Map 存儲一個鍵和一個值,如果你不關心值,你可以使用一個Set (注意,所有值在這種類型的集合中都是唯一的)因為Set::containsO(1) .


正如評論中提到的@n247s。 除非您確實遇到性能問題,否則String::contains應該可以正常工作並使代碼更易於閱讀。

HashMap<>只是一個擴展Map<>接口的 class ,您可以使用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);
}

Set將是在這里使用的一個很好的數據結構。

不過,請注意一件事,

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

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

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

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

如果您不關心插入順序,最好的方法是使用Set ,但如果您這樣做,您應該使用LinkedHashSet ,這將使您的字符保持插入順序。

這是LinkedHashSet文檔的鏈接。 https://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashSet.html

But if you actually want to use the key / value pair of the HashMap , you can indeed use a HashMap<Character, Character> , then you can check with map.containsKey() O(1) , and map.containsValue() O(n)請記住,因為containsValue()將使用O(n) ,所以最好只檢查String::contain在那種情況下。 如果您關心插入順序,還有一個LinkedHashMap可以為您做到這一點。 鏈接到下面的文檔https://docs.oracle.com/javase/8/docs/api/java/util/LinkedHashMap.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM