- Эффективное удаление определенных символов (некоторые знаки пунктуации) из строк в Java?
- 7 ответов
- Как я могу удалить пунктуацию из входного текста в Java?
- 4 ответа
- Удаление знаков препинания из строки
- Решение
- Эффективное удаление определенных символов (некоторые знаки пунктуации) из строк в Java?
- 7 ответов
- Как убрать все знаки препинания, кроме пробелов или чисел в Java
- 2 ответа
Эффективное удаление определенных символов (некоторые знаки пунктуации) из строк в Java?
В Java, каков наиболее эффективный способ удаления данных символов из строки? В настоящее время у меня есть этот код:
private static String processWord(String x) < String tmp; tmp = x.toLowerCase(); tmp = tmp.replace(",", ""); tmp = tmp.replace(".", ""); tmp = tmp.replace(";", ""); tmp = tmp.replace("!", ""); tmp = tmp.replace("?", ""); tmp = tmp.replace("(", ""); tmp = tmp.replace(")", ""); tmp = tmp.replace("", ""); tmp = tmp.replace("[", ""); tmp = tmp.replace("]", ""); tmp = tmp.replace("", ""); tmp = tmp.replace("%", ""); return tmp; >
Было бы быстрее, если бы я использовал какой-то StringBuilder, или регулярное выражение, или, может быть, что-то еще? Да, я знаю: профилируйте это и посмотрите, но я надеюсь, что кто-то может дать ответ макушки, так как это обычная задача.
7 ответов
Вот поздний ответ, просто для удовольствия.
В таких случаях я бы предложил стремиться к удобочитаемости, а не к скорости. Конечно, вы можете быть суперчитабельным, но слишком медленным, как в этой суперкомпактной версии:
private static String processWord(String x) < return x.replaceAll("[][()<>,.;!?<>%]", ""); >
Это медленно, потому что каждый раз, когда вы вызываете этот метод, регулярное выражение будет компилироваться. Таким образом, вы можете предварительно скомпилировать регулярное выражение.
private static final Pattern UNDESIRABLES = Pattern.compile("[][()<>,.;!?<>%]"); private static String processWord(String x)
Это должно быть достаточно быстрым для большинства целей, предполагая, что механизм регулярных выражений JVM оптимизирует поиск класса символов. Это решение, которое я бы использовал лично.
Теперь без профилирования я бы не знал, могли бы вы добиться большего успеха, создав таблицу поиска для своего собственного символа (на самом деле с кодовой точкой):
private static final boolean[] CHARS_TO_KEEP = new boolean[];
Заполните это один раз, а затем повторите, получая полученную строку. Я оставлю код для вас.:)
Опять же, я бы не стал погружаться в этот вид оптимизации. Код стал слишком сложным для чтения. Производительность так важна? Также помните, что современные языки JITted и после прогрева они будут работать лучше, поэтому используйте хороший профилировщик.
Одна вещь, которую следует упомянуть, это то, что пример в исходном вопросе крайне неэффективен, потому что вы создаете целую кучу временных строк! Если компилятор не оптимизирует все это, это конкретное решение будет работать хуже.
Как я могу удалить пунктуацию из входного текста в Java?
Я пытаюсь получить предложение с использованием ввода от пользователя в Java, и мне нужно сделать его строчным и удалить все знаки препинания. Вот мой код:
String[] words = instring.split("\\s+"); for (int i = 0; i < words.length; i++) < words[i] = words[i].toLowerCase(); >String[] wordsout = new String[50]; Arrays.fill(wordsout,""); int e = 0; for (int i = 0; i < words.length; i++) < if (words[i] != "") < wordsout[e] = words[e]; wordsout[e] = wordsout[e].replaceAll(" ", ""); e++; >> return wordsout;
Я не могу найти способ удалить все небуквенные символы. Я пробовал использовать регулярные выражения и итераторы без везения. Спасибо за любую помощь.
4 ответа
Это сначала удаляет все небуквенные символы, складывает их в нижний регистр, а затем разбивает входные данные, выполняя всю работу в одной строке:
String[] words = instring.replaceAll("[^a-zA-Z ]", "").toLowerCase().split("\\s+");
Пространства сначала остаются на входе, поэтому раскол будет работать. Удаляя символы мусора перед расщеплением, вы избегаете прокрутки элементов.
@hendy да, «å» — это буква Unicode. Я ответил за латинский контекст. Чтобы обслужить любую букву, регулярное выражение будет «[^\\p ]» , которое использует нотацию POSIX для «буквы».
Интересно, должно ли понимание Unicode быть «практикой по умолчанию» для большинства / начинающих программистов? Я имею в виду, что американским / индонезийским программистам никогда не приходилось иметь дело со странными персонажами в их «реальной» жизни. Таким образом, их код, вероятно, отражает это, поэтому, хотя они используют UTF8, есть непреднамеренное предположение, что буквы являются AZ. Турецкий или арабский программист OTOH в первую очередь распознает этот сценарий и будет искать решение Unicode. Как вы думаете? (Это просто побочное обсуждение)
@ilija139 ilija139 конечно — все не буквы / пробелы удаляются на первом этапе. Чтобы сохранить цифры тоже, просто добавьте цифры к сохраняемым символам — т.е. измените на replaceAll(«[^a-zA-Z0-9 ]», «»)
Если вы не хотите использовать RegEx (что кажется крайне ненужным с учетом вашей проблемы), возможно, вам стоит попробовать что-то вроде этого:
public String modified(final String input)
Он проходит через базовый char[] в String и добавляет только char , если это буква или цифра (отфильтровать все символы, которые я принимаю, это то, что вы пытаетесь выполнить), а затем добавляет строчную версию char .
Вы можете попробовать следующее: —
Scanner scan = new Scanner(System.in); System.out.println("Type a sentence and press enter."); String input = scan.nextLine(); String strippedInput = input.replaceAll("\\W", ""); System.out.println("Your string: " + strippedInput);
[^\w] соответствует символу без слова, поэтому приведенное выше регулярное выражение будет соответствовать и удалять все символы, отличные от слова. @RohitJain:- — Да, я понял твою точку зрения. Но я подумал о пунктуации, которую мы часто использовали в языке. Я взял буквальное значение пунктуации .
Удаление знаков препинания из строки
Здравствуйте, в моем коде в массиве words по отдельности хранятся слова строки, но их разделение происходит по пробелу. Если после слова в строке будет стоять, например, запятая, то она тоже запишется в массив.
Подскажите пожалуйста, как это можно исправить.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
import java.util.HashMap; import java.util.Map; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("Введите строку: "); String input = scanner.nextLine(); System.out.print("Введите букву: "); char letter = scanner.next().charAt(0); String[] words = input.split("\\s+"); //записали строку в массив пословно MapString, Integer> wordCount = new HashMap<>(); for (String word : words) { int count = 0; for (int i = 0; i word.length(); i++) { if (word.charAt(i) == letter) { count++; //в переменной count хранится количество повторений необходимой буква в слове } } wordCount.put(word, count); //в переменной wordCount хранится слово и соответствующее ему количество повторений } int maxCount = 0; for (int count : wordCount.values()) { //поочередно возвращает количество повторяющихся букв в каждом слове if (count > maxCount) { maxCount = count; } } System.out.print("Слова, где буква \"" + letter + "\" встречается наибольшее количество раз: "); for (Map.EntryString, Integer> entry : wordCount.entrySet()) { if (entry.getValue() == maxCount) { //если количество повторяющихся букв равно наибольшему значению повторений, System.out.print(entry.getKey() + " ");//то слово выводится } } } }
Строка: Из строки S создать строку без знаков препинания, состоящую из слов, которые начинаются с большой буквы
Добрый день, помогите пожалуйста с программой, буду очень благодарен. Строка S в которой слова.
Найти и вывести количество знаков препинания
Задание найти и вывести количество знаков препинания, что встречаются в тексте Помогите исправить.
Определить количество знаков препинания в предложении
С клавиатуры посимвольно вводится предложение. Определить количество знаков препинания в.
Сообщение было отмечено nz2003 как решение
Решение
Сообщение от nz2003
Эффективное удаление определенных символов (некоторые знаки пунктуации) из строк в Java?
В Java, что является наиболее эффективным способом удаления данных символов из строки? В настоящее время у меня есть этот код:
private static String processWord(String x) < String tmp; tmp = x.toLowerCase(); tmp = tmp.replace(",", ""); tmp = tmp.replace(".", ""); tmp = tmp.replace(";", ""); tmp = tmp.replace("!", ""); tmp = tmp.replace("?", ""); tmp = tmp.replace("(", ""); tmp = tmp.replace(")", ""); tmp = tmp.replace("", ""); tmp = tmp.replace("[", ""); tmp = tmp.replace("]", ""); tmp = tmp.replace("", ""); tmp = tmp.replace("%", ""); return tmp; >
Было бы быстрее, если бы я использовал какой-то StringBuilder или регулярное выражение или, может быть, что-то еще? Да, я знаю: прокомментируйте это и посмотрите, но я надеюсь, что кто-то может дать ответ на верхушку головы, поскольку это общая задача.
В целом, Java Regex работает довольно хорошо, и если я не делал что-то очень чувствительное к производительности, я обычно просто использую «Я» и продолжаю. Также tmp.replaceAll («\\ W», «») избавит от пунктуации и пробелов в строке.
Запрос на уточнение: пожалуйста, определите, что вы подразумеваете под пунктуацией . Это только те персонажи, которые вы перечислили выше? Как насчет их тире? Как насчет фигурных цитат? А как насчет символов цитаты из неанглийских языков?
Следуйте этому в следующий раз, когда вы сможете найти решение относительно регулярных выражений самостоятельно.
@Pshemo ПРЯМОГО ответа там нет. Но это поможет понять, кроме копирования . и в следующий раз он может найти способ решить такие вещи. Я никогда не говорю, что будет ОТВЕТ. Я сказал, что это может помочь вам
7 ответов
Вот поздний ответ, просто для удовольствия.
В подобных случаях я бы предложил повысить читаемость по скорости. Конечно, вы можете быть суперчитабельными, но слишком медленными, как в этой супер-сжатой версии:
private static String processWord(String x) < return x.replaceAll("[][()<>,.;!?<>%]", ""); >
Это медленно, потому что каждый раз, когда вы вызываете этот метод, regex будет скомпилирован. Поэтому вы можете предварительно скомпилировать регулярное выражение.
private static final Pattern UNDESIRABLES = Pattern.compile("[][()<>,.;!?<>%]"); private static String processWord(String x)
Это должно быть достаточно быстро для большинства целей, предполагая, что движок JVM regex оптимизирует поиск класса символов. Это решение, которое я бы использовал лично.
Теперь без профилирования я не знаю, сможешь ли ты сделать лучше, создав таблицу собственных символов (фактически кодовую):
private static final boolean[] CHARS_TO_KEEP = new boolean[];
Заполните это один раз, а затем итерайте, создав свою итоговую строку. Я оставлю код вам.:)
Опять же, я бы не стал погружаться в такую оптимизацию. Код стал слишком трудным для чтения. Является ли производительность такой проблемой? Также помните, что современные языки JITted, и после прогрева они будут работать лучше, поэтому используйте хороший профилировщик.
Одна вещь, о которой следует упомянуть, состоит в том, что пример в исходном вопросе очень неактивен, потому что вы создаете целую кучу временных строк! Если компилятор не оптимизирует все это, это конкретное решение будет наихудшим.
Это не совсем верно: приведенное регулярное выражение «[] [() <>,.;!? <>%]» Недопустимо, так как содержит специальные символы. Тем не менее, цитирование с \ Q и \ E работает хорошо: «» [\\ Q] [() <>,.;! <>% \\ E] «(обратная косая черта увеличилась вдвое из-за Java). Я собираюсь принять этот ответ, так как это тот, который я в конечном итоге использовал, и все альтернативы были четко объяснены, не говоря уже о том, что только точные упомянутые символы удаляются этим.
Отрицательные взгляды — отличное дополнение к этому, которое я нашел в этом ответе: stackoverflow.com/questions/9880941/… . Этот шаблон: «(?! [._]) \\ p » удаляет все знаки препинания в классе Punct, кроме ._ Это хорошо, если вы хотите удалить все знаки пунктуации, но сохранить несколько символов.
Хотя \\p будет указывать более широкий диапазон символов, чем в вопросе, он позволяет использовать более короткое замещающее выражение:
Как убрать все знаки препинания, кроме пробелов или чисел в Java
Как удалить все знаки препинания, кроме пробелов или чисел в Java.
"\\p|\\d", "" //THIS WORKS BUT IT REMOVES THE NUMBERS AND I DONT WANT IT TO REMOVE THE NUMBERS.
Я читаю текст, и мне нужно удалить пунктуацию.
String[] internal; char ch = 'a'; int counter = 1; int count; int c; Map dictionary = new HashMap(); BufferedReader in = new BufferedReader(new FileReader("yu.txt")); while (in.ready()) < internal = (((in.readLine()).replaceAll("\\p|\\d", "")).toLowerCase()).split(" ");//this does not work in my case cause it removes numbers. and makes them whitespaces but other than that this one works I JUST dont want it to remove numbers and keep whitespaces. for (count = 0; count < internal.length; count++) < if (!dictionary.containsKey(internal[count])) < dictionary.put(internal[count], new HashSet()); >if (dictionary.get(internal[count]).size() <10) < dictionary.get(internal[count]).add(counter); >> counter++; > Iterator iterator = dictionary.keySet().iterator(); while (iterator.hasNext())
2 ответа
Я не знаю о существующем классе (по умолчанию), который может это сделать.
Вам нужно будет написать логику, которая будет проходить через символ String за символом и проверять, является ли символ пунктуацией. Если это так, то обрежьте строку на один символ раньше и добавьте оставшуюся часть (эффективно удаляя этот символ / пунктуацию).
Предпочитаю использовать StringBuilder или StringBuffer вместо прямого манипулирования строкой.
Используйте метод String.substring(), чтобы вырезать строку.
В противном случае используйте метод String.replace()/String.replaceAll(), чтобы заменить все знаки пунктуации (вам нужно будет экранировать определенные символы) на «».