jak zmienić literę w stringu na określonej pozycji

0

Myślałem żeby zrobić tak jak niżej przy użyciu substring, ale jak pozycja będzie ostatnim indexem w tekście to nastąpi wyjście poza zakres, więc trzeba dodać kolejnego ifa, a nie ma jakiejś metody, która by po prostu zmieniała literę w stringu pod danym indexem?

String tekst = "abcde";
String nowy_tekst = null;
String pozycja = 4;
if(tekst.charAt(pozycja) == 'a') nowy_tekst = tekst.substring(0, pozycja) + "11" + tekst.substring(pozycja+1);
else nowy_tekst = tekst.substring(0, pozycja) + "22" + tekst.substring(pozycja+1);
0

Przekonwertować Stringa na List?

1

Możliwe rozwiązania:

  1. String.toCharArray, potem podmiana znaku, potem new String(tablicaCharow),
  2. Użycie StringBuilder.setCharAt, ale to raczej w sytuacji, gdy robisz wiele operacji na danym ciągu znaków,

Rozwiązanie z List<Char> to duży narzut wydajnościowy, nie mówiąc już o tym, że kodu też wyjdzie dużo.

0

To rozwiązanie wibowita z String.toCharArray jest chyba najlepsze. Faktycznie szkoda, że nie można w Javie zrobić po prostu, np. tekst[1] = "2" tylko trzeba kombinować.

0

W Javie final jest płytki, tzn w przypadku Stringa final String ble nie dawałby jego niemutowalności, nie ma czegoś takiego jak metody typu const z C++, a więc musiałoby być rozróżnienie na MutableString i ImmutableString. To raczej zbyt duży kłopot tylko po to, aby można było sobie zmieniać Stringa w nieco inny sposób.

Dzięki niemutowalności metoda substring ma złożoność O(1), tzn niezależną od długości stringa.

Wszystkie Stringi występujące w kodzie Javowym lecą do puli stałych. Wyobraźcie sobie co by było, gdyby Stringi były mutowalne i zachowana byłaby pula Stringów z kodu:

class A {
String a = "string";
void m() {
  a.setCharAt(1, 'p');
}
}
class B {
String b = "string";
}

void m() {
new A().m();
System.out.println(new B().b)); // spring???
}

Inne info:
http://stackoverflow.com/questions/3407403/whats-the-advantage-of-a-string-be-immutable

PS:
W zasadzie to jest ten mutowalny string w Javie i nazywa się StringBuilder/ StringBuffer. Tak, że nic straconego.

0
wiewiorek napisał(a)

Myślałem żeby zrobić tak jak niżej przy użyciu substring, ale jak pozycja będzie ostatnim indexem w tekście to nastąpi wyjście poza zakres, więc trzeba dodać kolejnego ifa, a nie ma jakiejś metody, która by po prostu zmieniała literę w stringu pod danym indexem?

Zdaje się, że bez kolejnego if'a lub operatora?: nie dałoby rady samym substringiem. Metody takiej nie znalazłem, a co do kodu:

String tekst = "abcde";
String nowy_tekst = tekst;
int pozycja = 4;
if(tekst.charAt(pozycja) == 'a') 
    nowy_tekst=tekst.substring(0, pozycja)+nowy_tekst.substring(pozycja).
            replaceFirst(Character.toString(tekst.charAt(pozycja)), "11");
else 
    nowy_tekst=tekst.substring(0, pozycja)+nowy_tekst.substring(pozycja).
            replaceFirst(Character.toString(tekst.charAt(pozycja)), "22");
System.out.print(nowy_tekst);
0

Po co tutaj replaceFirst? W czym niby ten kod lepszy?

Można napisać:

final String tekst = "abcde";
final int pozycja = 4;
final String nowy_tekst = new StringBuilder(tekst).replace(pozycja, pozycja + 1, tekst.charAt(pozycja) == 'a' ? "11" : "22").toString();
0

A nie lepiej użyć stringbuffer i użyć metody replace ?

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