Я пытаюсь создать метод в JAVA для «вычитания» подстроки из заданной строки. Например, если я ввел «комитет» и «встретился», на выходе должно быть указано «комит».

Это то, что у меня есть до сих пор, но оно не делает то, что должно. Я почти уверен, что проблема заключается в повторении вложенного цикла for в конце кода, но я не могу понять, в чем проблема или как ее исправить.

public static String remove(String str1, String str2) {
    char[] char1 = new char [str1.length()];
    char[] char2 = new char [str2.length()];
    char[] char3 = new char [str1.length()];
    int k = 0;
    
    for (int i = 0; i < str1.length(); i++) { // converts str1 to char1
        char1[i] = str1.charAt(i);
    }
    
    for (int j = 0; j < str2.length(); j++) { // converts str2 to char2
        char2[j] = str2.charAt(j);
    }
    
    for (int i = 0; i < char1.length; i++) { // loops through char1
        for(int j = 0; j < char2.length; j++) {
            if (char1[i] != char2[j]) {
                char3[k] = char1[i];
            }
        }
            
        k++;
    }
    
    return String.valueOf(char3);
}   
1
RONOLULU 5 Дек 2020 в 17:12

2 ответа

Лучший ответ

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

public class Test1 {
    public static void main(String[] args) {
        String result = remove("committee", "meet");
        System.out.println(result);
    }

    //str1 is the original string, str2 is the array of chars to be removed from str1
    public static String remove(String str1, String str2) {
        for (int i=0; i < str2.length(); i++) {
            str1 = str1.replaceFirst(Character.toString(str2.charAt(i)), "#"); //tag the one deleted using specific character
        } //end for
        
        StringBuilder sb = new StringBuilder();
        //Populate the non deleted chars
        for (int i=0; i < str1.length(); i++) {
            if (str1.charAt(i) != '#') { //only copy character which has not yet been deleted
                sb.append(str1.charAt(i));
            } //end if
        } //end for
        return sb.toString();
    }   
}

Пример вывода:

comit
0
Agus 5 Дек 2020 в 15:16

Разве это не будет проще:

   public class StringSubtract {
        public static void main(String[] args) {
            String result = subtract("committee", "meet");
            System.out.println(result);
        }
    
        public static String subtract(String str1, String str2) {
            for (int i=0; i < str2.length(); i++) {
                str1 = str1.replaceFirst(Character.toString(str2.charAt(i)), "");
            } //end for
    
            return str1;
        }
    }
0
TAM 5 Дек 2020 в 16:38