Содержимое электронной почты должно быть отфильтровано со словами в словаре - PullRequest
3 голосов
/ 02 июля 2011

Мне задали вопрос в интервью. Вопрос состоял в том, что входную строку (которая может прийти из электронной почты или большого текстового файла) необходимо отфильтровать со списком плохих слов и заменить чем-то другим.

например, если входная строка содержит плохие слова, которые существуют в списке плохих слов, плохое слово необходимо заменить чем-то другим, например, пустой строкой или подстановочным символом.

Решение, которое я придумала, состояло в том, чтобы поместить все плохие слова в хэш-карту и поместить входную строку в StringBuffer и извлечь слово за словом, разделенным пробелом, и проверить, существует ли слово в хэш-карте, если оно существует, заменить слово с пустой строкой. Но интервьюер сказал, что манипулирование StringBuffer может быть дорогим, потому что stringBuffer поддерживает массив символов. Замена означает, что необходимо скопировать в новый массив.

У кого-нибудь есть лучший алгоритм вместо этого решения?

Спасибо.

Ответы [ 4 ]

2 голосов
/ 02 июля 2011

Вы можете сначала разобрать String в String[] (используя split()) и, выполнить итерацию по словам и проверить, нужно ли заменить слово, ища его в ваших HashMap<String,String> словах из черного списка. (если это так, вы просто заменяете ссылку на 'replace to' [значение String на карте] и не создаете новую строку). затем, используя StringBuilder, перестройте новую строку.

должно выглядеть примерно так:

public static String replaceString(Map<String,String> map,String input) { 
    String[] arr = input.split("\\s");
    for (int i = 0;i<arr.length;i++) { 
        String val = map.get(arr[i]);
        if (val != null) arr[i] = val;
    }
    StringBuilder sb = new StringBuilder();
    for (String s : arr) {
        if (s == null || s.length() == 0 ) continue;
        sb.append(s).append(' ');
    }
    return sb.toString().trim();
}
0 голосов
/ 02 июля 2011

Если типичное сообщение не содержит ненормативную тираду, в которой необходимо заменить каждое 2-е или 3-е слово, вы, вероятно, не будете выполнять достаточно операций замены для этого типа микрооптимизации, чтобы когда-либо приносить 1 секунду ЦП экономия времени за год.

С учетом вышесказанного, было бы более эффективно добавлять результирующую строку слово за словом в новый StringBuffer вместо замены содержимого исходного StringBuffer, потому что тогда вам никогда не придется сдвигать содержимое, которое следует после слово, которое вы заменяете.

0 голосов
/ 02 июля 2011

если вы разбиваете ввод на слова и затем фильтруете их по черному списку, а затем выводите их, конкатенация строк не требуется. я думаю, что интервьюер смутился, когда вы использовали замену, и подумал, что вы меняете входной буфер, чтобы удалить слова из черного списка.

метод имеет итератор для ввода, возвращающий слова, и цикл для этих слов, и если слово отсутствует в черном списке, оно выводится.

0 голосов
/ 02 июля 2011

Пусть фреймворк позаботится о деталях и использует регулярные выражения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...