Gyakorlati alapok

S t r i n g  s z é t h ú z v a

 

Még mindig benne vagyunk abban a virtuális lendületben, amely során egy bemeneti String vagy StringBuffer adattípust ráncigálunk, manipulálunk össze-vissza. Ebben a rövid fejezetben szóköz-hézagokkal fogjuk feltölteni, ezáltal "széthúzva" a szöveget.

 

A feladat tehát a következő: legyen a végeredmény String széthúzva beviteli szöveg esetén S t r i n g  s z é t h ú z v a!

 

www.informatika-programozas.hu - Ezt most meg kell tanulni!

 

A legelső probléma, amivel szembesülünk, hogy a széthúzás megváltoztatja a szövegméretet, ebből következően bár nem volna lehetetlen, de csak nagyon nehézkesen tudnánk String adattípust alkalmazni. (Emlékezzünk vissza, hogy ezen adattípus mérete létrehozása után már nem változtatható meg.) Helyette pontosan ilyen helyzetekre találták ki a jóval dinamikusabb tulajdonságokkal rendelkező StringBuilder és StringBuffer adattípusokat.

 

A kód motorja még mindig egy "tolató", azaz bemeneti StringBuffer típusú karakterfüzéren visszafelé lépkedő for ciklus: az i léptetőértéket (iterátor) csökkentve, az insert(offset, character) függvény segítségével töltjük be a végeredményt a StringBuffer kimeneti adattípusba.

 

Azonban egy if feltételt is be kell iktatnunk a rendszerbe, hiszen nélküle végeredmény ez lenne:

 

Végeredmény:

String széthúzva
 S t r i n g  s z é t h ú z v a

 

Tehát azt kell megakadályozunk, hogy az utolsó, 0. indexen lévő karakter utáni szóköz-feltöltés végrehajtásra kerüljön. Így az...

 

if(i == 0){
    break;
    }

 

...feltétel break utasítása megállítja a ciklus futását (a Folytassa béka! (a break és a continue utasítás) című fejezet.

 

Nézzük meg a futtatható Java-kódokat!

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 

 

public class Main {
public static void main(String[] args) {
    StringBuffer bemenetiString = new StringBuffer("String széthúzva");
    StringBuffer kimenetiString = new StringBuffer();
    System.out.println(bemenetiString);
    for(int i = bemenetiString.length() - 1; i >= 0; i--) {
        if(i == 0){
            break;
        }
        kimenetiString = bemenetiString.insert(i, ' ');
    }
    System.out.println(kimenetiString);
    }
}

 

Végeredmény:

String széthúzva
S t r i n g  s z é t h ú z v a

 

Tanítványi kérdés
Lehetséges-e megoldani ezt a feladatot
String típussal?

Válasz

Lehetséges, nagyon egyszerűen:

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 

 

public class Main {

public static void main(String[] args) {
    String input = "String szethuzva";
    System.out.print(input + "\n");
    for(int i = 0; i < input.length(); i++) {
        System.out.print(input.charAt(i) + " ");
        }
    }
}

 

Végeredmény:

String széthúzva
S t r i n g   s z e t h u z v a

 

Ha azonban a műveletet nem "röptében", hanem adattárolással kívánjuk megoldani, akkor figyelembe kell vennünk a String című fejezetben leírtakat: a String objektum alapjában véve megváltoztathatlan (inmutable), ezért a feladat megoldása csakis akkor lehetséges, ha megengedjük, hogy az eredeti objektumról másolatokat készíthessünk, azaz lényegében átmeneti tárolókat, például karaktertömböket használhassunk fel. Ezt láthatjuk az alábbi megoldásban. Végeredményként a karaktertömb tartalmát kilistáztuk.

 

Nézzük meg a futtatható Java-kódot:

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 

 

public class Main {

public static void main(String[] args) {
    String input = "String szethuzva";
    System.out.print(input);
    System.out.println();
    char [] storing = new char[input.length()*2];
    int i = 0;
    int j = 1;
    int k = 0;
    do{
        storing[i] = input.charAt(k);
        storing[j] = ' ';
        i += 2;
        j += 2;
        k++;
        }while(i < storing.length);
    for(i = 0; i < storing.length; i++) {
        System.out.print(storing[i]);
        }
    }
}

 

Végeredmény:

String széthúzva
S t r i n g  s z e t h u z v a

 

A karaktertömb tartalmát már könnyű átvezetni egy másik, eredménytároló sztringbe:

String eredmenyString = new String(storing);

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 

 

public class Main {

public static void main(String[] args) {
    String input = "String szethuzva";
    System.out.print(input);
    System.out.println();
    char [] storing = new char[input.length()*2];
    int i = 0;
    int j = 1;
    int k = 0;
    do{
        storing[i] = input.charAt(k);
        storing[j] = ' ';
        i += 2;
        j += 2;
        k++;
        }while(i < storing.length);
    for(i = 0; i < storing.length; i++) {
        System.out.print(storing[i]);
        }

    System.out.println();
    String eredmenyString = new String(storing);
    System.out.print(eredmenyString);
    }
}

 

Végeredmény:

String széthúzva
S t r i n g  s z e t h u z v a

S t r i n g  s z e t h u z v a