Заменить несколько вхождений символа


Я пытаюсь заменить несколько вхождений символа один символ.

Вход:

ххиии!!! hooowww aaareee yyyooou???

Выход:

привет! как ты?

public class CharSingleOccurrence {
    public static void main(String... args){
        charSingleOccurrence("hhiii!!!  hooowww   aaareee   yyyooou???");
    }
    public static void charSingleOccurrence(String str){
        int i=0;
        int j=0;
        char arr[]=new char[50];
        while (i<str.length()-1) {            
            if(str.charAt(i)!=str.charAt(i+1)){
                arr[j]=str.charAt(i);
                i++;
                j++;
            }else{
                i++;
            }
        }
        arr[j]=str.charAt(str.length()-1);
        for(char c:arr){
            System.out.print(c);
        }
    }
}

Вот мне нужен комментарий для

  • голец модуль arr[]=новый тип char[50];
  • ул. Арр[Дж]=.ул. Героев (.длина()-1);


16423
8
задан 27 октября 2011 в 07:10 Источник Поделиться
Комментарии
3 ответа

Я думаю, что это странно и сложно...хотя, я на 99% уверен, что это можно сделать одной строкой регулярного выражения, я не знаю, как из верхней части моей головы1.

Это может быть сокращен гораздо проще и короче решение без массивов вообще.

String input = "hhiii!!!  hooowww   aaareee   yyyooou???";
StringBuilder output = new StringBuilder();

// Append the first character of the string.
// We can also let the loop start at 0, but then
// we'd need an additional if inside the loop, which
// I'd like to avoid.
output.append(input.charAt(0));

// Start the loop at 1, because we already have the first character.
// We can not
for (int idx = 1; idx < input.length(); idx++) {
// Check the current against the previous character.
if(input.charAt(idx) != input.charAt(idx-1)) {
// If it is not the same, append it.
output.append(input.charAt(idx));
}
}

Конечно, нужно обезопасить себя от неверного ввода (пустой или пустой строкой), а также перенос слов с двойной персонажей: фрагментик, инструмент, поддержка и т. д..

Некоторые дополнительные замечания по коду:


  • Название функции: это не непосредственно видно, что функция делает. Она должна называться что-то вдоль линий removeDoubleChars или removeMultipleCharacters.

  • Тип функции: функцию нельзя напрямую выводить результат в системе.из а вернуть его.

  • Петли: использовать соответствующие петли, Ф.е. ваше время должно быть для.

  • Имена переменных: я знаю, что это отчасти учил, но у меня мурашки по коже (или стать Крипера) если я вижу переменные, которые назвал я, Джей и аранж. Давать переменным осмысленные имена! В любом современном языке имя переменной, ни общества не имеет значения для производительности. Писать код в первую очередь для людей, и только во вторую-для машин...кодер, который должен поддерживать ваш код после вас будут вам благодарны.

  • Пробельные символы: используйте их! если(стр.используя метод charat(я)!=ул. используя метод charat(я+1)){
    труднее читать тогда если(стр.используя метод charat(я) != ул. используя метод charat(я + 1)) {.

  • Дублирование кода: избежать дублирования кода. В данном случае это мелочь, но я++ должны быть вынесены за пределы В если, так что это не стоит есть еще часть.

1: но Джон делает.

11
ответ дан 27 октября 2011 в 07:10 Источник Поделиться

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

System.out.println("hhiii!!!  hooowww   aaareee   yyyooou???"
.replaceAll("(.)\\1+","$1"));

11
ответ дан 27 октября 2011 в 07:10 Источник Поделиться

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

Это C# код, но я думаю, что это следует перевести достаточно легко в Java:

public static string CharSingleOccurance(string value) {
StringBuilder result = new StringBuilder();
char? last = null;
foreach (char c in value) {
if (!last.HasValue || c != last.Value) {
result.Append(c);
last = c;
}
}
return result.ToString();
}

Редактировать:

Вот предложение покоряли для перевода Ява:

public static String charSingleOccurance(String value) {
StringBuilder result = new StringBuilder();
char last = '\u0000';

for (char c : value.toCharArray()) {
if (last == '\u0000' || c != last) {
result.append(c);
last = c;
}
}

return result.toString();
}

7
ответ дан 27 октября 2011 в 07:10 Источник Поделиться