Metoda string zwracająca string

0

Napisałem taką oto metodę:

public static String censorByRemoving(String tekst, String innytekst) {
        String result = "";
        for (int i = 0; i < tekst.length(); i++) {
            result = tekst.replace(innytekst, "");
        }
        return result;
    }

W testach podaje łańcuch "Ala ma kota", a drugi "ma". Metoda powinna zwrócić z pojedynczą spacją pomiędzy wyrazami "Ala kota", a zwraca "Ala kota" z podwójną spacją. Nie mogę się pozbyć jednej spacji między tymi dwoma wyrazami. Nie wiem jak to zrobić i niestety nie mogę modyfikować nagłówka metody. Może ktoś wie jak rozwiązać ten problem?

1

Żeby nie mieć spacji na początku ani na końcu użyj funkcji Trim.
A tak to sprawdzaj czy są 2 spacje koło siebie i wtedy jedną usuwaj.

Na Janusza mógłbyś zrobić tak:

public static String censorByRemoving(String tekst, String innytekst)
        {
            String result = "";
            for (int i = 0; i < tekst.length(); i++)
            {
                result = tekst.replace(innytekst, "");

            }
            for (int i = 0; i < result.length(); i++)
            {
                result = result.replace("  ", " ");
            }
            return result;
        }
1

Nie wiem jak bardzo ma byc to odporne na input, ale zakladam, ze zadajac takie pytanie dopiero zaczynasz swoja przygode z kodowaniem.
Najprostsze, ale najmniej odporne rozwiazanie to po prostu do innytekst (btw. uzywaj prosze angielskich nazw zmiennych :) ) dodaj spacje.

innytekst.concat(" ")
// lub jezeli wolisz
innytekst+" "

Ja jednak bym sprawdzil wyrazeniem regularnym czy w wyniku koncowym znajduja sie pod rzad wiecej niz jedna spacja i zwyczajnie zamienil je na jedna.

result.replaceAll(" +", " ");
//dla lepszego wyniku warto usunac jeszcze wszelkie whitespace'y z przodu i z tylu
result.trim();

Ta opcja jest bardziej odporna na dziwny input.

0

Możesz to ugryźć tak:

  public static String censorByRemoving(String text, String otherText) {
        // usunięcie wszystkich wystąpień tekstu 'otherText'
        text = text.replaceAll(otherText, "");

        while(text.contains("  ")){
            // usunięcie podwójnych spacji
            text = text.replaceAll("  "," ");
        }

        // obcięcie spacji z początku i końca
        return text.trim();
    }

Interaktywny przykład: https://programuj.pl/snippet/b49cbbdc-3543-4711-9cc2-fe95ab2dd946

0

Chciałem zobaczyć czy da się zrobić dla tego one-linera z użyciem regexów i wyszedł mi taki potworek, wrzucam w ramach ciekawostki:

    public static void main(String[] args) {
	    assert "Ala kota".equals(replaceAndNormalize("Ala ma kota", "ma"));
	    assert "Ala kota".equals(replaceAndNormalize("Alama kota", "ma"));
	    assert "Ala kota".equals(replaceAndNormalize("Alama  kota", "ma"));
	    assert "Ala kota".equals(replaceAndNormalize("Ala makota", "ma"));
	    assert "Ala kota".equals(replaceAndNormalize("Ala  makota", "ma"));
	    assert "Ala kota".equals(replaceAndNormalize("Ala   ma   kota", "ma"));
	    assert "Ala kota".equals(replaceAndNormalize("Ala   ma   kota", "  ma  "));
	    assert "Alakota".equals(replaceAndNormalize("Alamakota", "ma"));
	    assert "kota".equals(replaceAndNormalize("makota", "ma"));
	    assert "".equals(replaceAndNormalize("ma", "ma"));
	    assert "()| []".equals(replaceAndNormalize("()| .+ []", ".+"));
    }

    private static String replaceAndNormalize(String input, String token) {
        return input.replaceAll("((\\s)+\\Q" + token + "\\E(\\s)+)|(\\Q" + token + "\\E(\\s)+)|((\\s)+\\Q" + token + "\\E)|(\\Q" + token + "\\E)", "$2$5$7");
    }

1 użytkowników online, w tym zalogowanych: 0, gości: 1