簡體   English   中英

用其全貌替換縮寫/俚語

[英]Replacing abbreviations/slangs with their fullforms

我使用HashMap存儲縮寫的完整表單。

public class Test {
    public static void main(String[] args) {
        Map<String, String> slangs = new HashMap<String, String>();
        slangs.put("lol", "laugh out loud");
        slangs.put("r", " are ");
        slangs.put("n", " and ");
        slangs.put("idk", " I don't know ");
        slangs.put("u", " you ");
        Set set = slangs.entrySet();
        Iterator i = set.iterator();

        String sentence = "lol how are you";
        StringBuilder sb = new StringBuilder();

        for (String word : sentence.split(" ")) {
            while(i.hasNext()) {
                Map.Entry<String, String> me = (Map.Entry)i.next();
                if (word.equalsIgnoreCase(me.getKey())) {
                    sb.append(me.getValue());
                    continue;
                }
                sb.append(word);
            }
        }
        System.out.println(sb.toString());
    }
}

輸出是:

lollollollaugh out loudlol

這里有什么問題,如何解決?

您不應該迭代條目來查找匹配項,您應該使用get(Object key)getOrDefault(Object key, V defaultValue)來獲取給定縮寫的完整形式,否則不要獲取完整的表單如果時間復雜度為O(1) ,你會得到一個O(n) ,這當然在表現方面不好,你將失去在Map中擁有你的鍵/值對的真正好處。 如果您因為這種情況而這樣做,只需將您的密鑰僅以小寫字母放在地圖中,並使用小寫字母調用getgetOrDefault ,如下所示:

所以你的循環應該是這樣的:

for (String word : sentence.split(" ")) {
    // Get the full form of the value of word in lower case otherwise use
    // the word itself
    sb.append(slangs.getOrDefault(word.toLowerCase(), String.format(" %s", word)));
}

輸出:

laugh out loud how are you

使用Stream API ,它可能只是:

String result = Pattern.compile(" ")
    .splitAsStream(sentence)
    .map(word -> slangs.getOrDefault(word.toLowerCase(), word))
    .collect(Collectors.joining(" "));

不要遍歷字典中的鍵。 相反,只需檢查鍵是否在地圖中並獲取相應的值。 另外,不要忘記將空格添加回組合句子中。

for (String word : sentence.split(" ")) {
    if (slangs.containsKey(word.toLowerCase())) {
        sb.append(slangs.get(word.toLowerCase()));
    } else {
        sb.append(word);
    }
    sb.append(" ");
}

如果您使用的是Java 8,還可以使用String.joinMap.getOrDefault和Streams:

String s = String.join(" ", Stream.of(sentence.split(" "))
        .map(word -> slangs.getOrDefault(word.toLowerCase(), word))
        .toArray(n -> new String[n]));

后一種方法還具有不在句子中的第一個單詞之后或之后添加空格的益處。

簡單地說,我認為您只需要檢查slangs包含此關鍵字。 請檢查我的代碼。

 public class Test {
    public static void main(String[] args) {

      Map<String, String> slangs = new HashMap<String, String>();
      slangs.put("lol", "laugh out loud");
      slangs.put("r", " are ");
      slangs.put("n", " and ");
      slangs.put("idk", " I don't know ");
      slangs.put("u", " you ");

      String sentence = "lol how are you";
      String[] words = sentence.split(" ");

      for (String word : words) {
        String normalizeWord = word.trim().toLowerCase();
        if(slangs.containsKey(normalizeWord)) {
            sentence = sentence.replace(word, slangs.get(normalizeWord));
        }
    }
    System.out.println(sentence);
  }
}

暫無
暫無

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

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