Замените символы в строке, используя метод замены java - PullRequest
1 голос
/ 23 апреля 2020

Я начинающий java программист, и я застрял на небольшой проблеме с моей университетской курсовой работой.

По сути, у меня есть строка, которую я хочу перебрать и заменить все вхождения буквы «a» или «e» на букву «z». Например, если исходная строка была «привет алан», конечная строка должна быть «hzllo zlzn».

Нам нужно сделать это, используя массив символов, который содержит символы «a» и «e» для проверки на строку.

Я включил свой код ниже, нам также нужно использовать метод charAt ().

public static void main(String[] args) {
    String a = ("what's the craic?");
    char letters[] = new char[]{'a', 't'};

    System.out.println("Before:" + a);
    System.out.println("After: " + removeCharacters(a, letters));
}

public static String removeCharacters(String sentence, char[] letters) {
    for (int i = 0; i < sentence.length(); i++) {
        for (int j = 0; j < letters.length; j++) {
            if (sentence.charAt(i) == letters[j]) {
                sentence = sentence.replace(sentence.charAt(i), 'z');
            } else {
                sentence = "No changes nessesary";
            }
        }
    }
    return sentence;
}

Пожалуйста, помогите мне с этой проблемой. Я не уверен, где я иду не так! Благодаря.

Ответы [ 4 ]

2 голосов
/ 23 апреля 2020

, если вам также разрешено использовать replaceAll

"hello alan".replaceAll( "[ae]", "z" );  // hzllo zlzn

В отличие от replace использует replaceAll a Pattern внутри, что компилируется из первого аргумента [ae] чтобы найти заменяемую часть вторым аргументом z. Это решение элегантно короткое, но медленное, потому что Pattern должен компилироваться каждый раз, когда вызывается replaceAll.

в противном случае используйте StringBuilder

char[] letters = new char[] { 'a', 'e' };
StringBuilder buf = new StringBuilder( "hello alan" );
IntStream.range( 0, buf.length() ).forEach( i -> {
  for( char c : letters )
    if( buf.charAt( i ) == c )
      buf.replace( i, i + 1, "z" );
} );
String s = buf.toString();  // hzllo zlzn

В отличие от String содержимое StringBuilder является взаимным (означает, что вы можете изменить его). Поэтому его нужно создать только один раз, и все замены могут быть сделаны на месте.

2 голосов
/ 23 апреля 2020

Попробуйте:

public static void main(String[] args) {
    String a = "hello alan";
    System.out.println("Before:" + a);
    System.out.println("After: " + removeCharacters(a));
}

public static String removeCharacters(String sentence) {
    if (!sentence.contains("a|e"))
        return "No changes necessary";
    return sentence.replaceAll("a|e", "z");
}

вывод 1:

Before:hello alan
After: hzllo zlzn

вывод 2:

Before:hi world
After: No changes necessary
1 голос
/ 23 апреля 2020

Поскольку String :: replace (char oldChar, char newChar) возвращает новую строку, полученную в результате замены всех вхождений oldChar в этой строке на newChar, вам не нужны вложенные циклы для выполнения Это. Эффективный способ сделать это может быть следующим:

public static String removeCharacters(String sentence, char[] letters) {
    String copy = sentence;
    for (char letter : letters) {
        sentence = sentence.replace(letter, 'z');
    }
    if (sentence.equals(copy)) {
        sentence = "No changes nessesary";
    }
    return sentence;
}

Демо:

public class Main {
    public static void main(String[] args) {
        // Test
        System.out.println(removeCharacters("hello stackoverflow", new char[] { 'a', 'e' }));
        System.out.println(removeCharacters("world", new char[] { 'a', 'e' }));
    }

    public static String removeCharacters(String sentence, char[] letters) {
        String copy = sentence;
        for (char letter : letters) {
            sentence = sentence.replace(letter, 'z');
        }
        if (sentence.equals(copy)) {
            sentence = "No changes nessesary";
        }
        return sentence;
    }
}

Выход:

hzllo stzckovzrflow
No changes nessesary
1 голос
/ 23 апреля 2020

Поскольку вы вынуждены использовать charAt(...), один из способов будет выглядеть следующим образом:

public static String removeCharacters(String sentence, char[] letters) {
    String output = "";
    boolean wasChanged = false;

    for (int i = 0; i < sentence.length(); i++) {
        char ch = sentence.charAt(i);

        for (int j = 0; j < letters.length; j++)
            if (ch == letters[j]) {
                ch = 'z';
                wasChanged = true;
                break;
            }

        output += ch;
    }

    if (wasChanged)
        return output;
    else
        return "No changes necessary";
}
...