Föreläsning 3: Textobjekt av typen String

Ett ord, en mening eller en längre text kallas ibland textsträng i datasammanhang. Det är en felöversättning av "string of characters", som i analogi med "string of pearls" (pärlhalsband) frammanar bilden av bokstavstecken uppträdda på ett snöre. När det gäller texthantering skiljer sej Java helt från Pascal, C och BASIC.

Primitiva typer och objekttyper

Typerna int, long, double, char, boolean är primitiva, dvs inbyggda i språket. Dessutom kan varje klassnamn användas som objekttyp. Det gäller ens egna klasser men framför allt alla klasser i javas standardpaket. En sådan klass är String. Låt oss jämföra dessa båda deklarationer.
    double pi   = 3.141592653589793;
    String namn = "Agaton Banan";
Den första deklarationen får datorn att avsätta ett minnesfack som rymmer arton siffror, kalla facket för pi och lagra det angivna värdet där. Den andra deklarationen får datorn att avsätta ett minnesfack som rymmer ett stort heltal (arton siffror), kalla facket för namn och lagra det långa namnet någon helt annan stans i minnet! Det skulle ändå inte ha fått plats i det lilla minnesfacket. Där lagrar man bara adressen till den plats i minnet där texten verkligen finns.

Anta nu att det längre ner i programmet står följande.

    pi   = 2.718281828459045;
    namn = "Sven-Hubert Pump";
Den första tilldelningen betyder att det nya värdet lagras i minnesfacket pi och att det gamla värdet försvinner. Den andra tilldelningen betyder att det nya namnet lagras någon helt annan stans i minnet och att adressen dit lagras i det lilla minnesfacket. Agaton Banan finns fortfarande kvar i minnet, men om han är helt bortglömd, dvs adressen dit inte finns sparad någonstans, kommer en automatisk skräpsamling (eng. garbage collection) att återvinna minnesutrymmet.

Konstruera och jämföra textobjekt

Ett textobjekt kan skapas på tre sätt.
  1. Med en textkonstant, alltså en text inom citattecken.
        String ord = "banan";
        String år  = "År ";
    
  2. Med ett anrop till en funktion vars värde är ett textobjekt.
           ord  = Mio.getWord();
           namn = Mio.getLine();
    
  3. Genom hopklistring av textojekt med andra texter, tal eller tecken.
           ord = år + 19 + 99; // Ger ord="År 1999"
           ord = 19 + 99 + år; // Ger ord="118År "
    
Jämförelsen if(namn == ord) kollar bara om det står samma minnesadress i båda variablerna, dvs om dom pekar på samma textobjekt. För att jämföra innehållet i textobjekten skriver man if(namn.equals(ord)).

Metoderna length() och charAt()

För String ord="banan" är ord.length()=5 och ord.charAt(0)='b'. Så här skriver man ut ordet bakfram.
class Reversera {
    public static void main(String[] args) {
	vändOchSkriv("banan");
    }

    public static void vändOchSkriv(String ord) {
	String bakfram = "";
	int i = ord.length() - 1;
	while (i >= 0) { 
	    bakfram += ord.charAt(i);
	    --i;
	}
	System.out.println(bakfram);
    }
}

När man startar programmet kan man ange att inläsningen ska göras från en fil i stället för från tangenterna. Anta att filen data.reg består av rader med personnummer och namn och att man vill ha ut alla damerna på skärmen.
// java Damer < data.reg  skriver ut följande
// 410423-1206 Eriksson, Gerd
// 720623-0067 Löfdahl, Jonna
// Om filen data.reg innehåller rader med personnummer och namn
class Damer {
    public static void main(String[] args) {
	while (!Mio.eof()) {
	    String rad = Mio.getLine();
	    if (rad.charAt(9) % 2 ==0) 
		System.out.println(rad);
	}
    }
}

Metoderna substring() och indexOf()

Övriga extraord i körkommandot finns i args[0], args[1] etc. Sökning i registret kan enklast göras så här.
// java Leta 640826-1052 < data.reg   skriver ut
// Viggo Kann
class Leta {
    public static void main(String[] args) {
	String pnr = args[0];

	while (!Mio.eof()) {
	    String rad = Mio.getLine();

	    if(rad.substring(0, 11).equals(pnr)) {
		int i = rad.indexOf(',');
		int n = rad.length();
		System.out.println(rad.substring(i + 2, n) + 
				   rad.substring(11, i));
		return;
	    }
	}
	System.out.println(pnr + " finns inte i registret.");
    }
}

Tionde siffran har valts så att nedanstående uträkning visar om det är något fel i personnumret.
// java Kolla 420119-0818 < data.reg   skriver ut
// RÄTT PNR; 420119-0818
class Kolla {
    public static void main(String[] args) {
	String pnr = args[0].substring(0, 6) + args[0].substring(7,11);

	int summa = 0;
	for(int i = 0; i < pnr.length(); ++i) {
	    int x = pnr.charAt(i)- '0';
	    if(i % 2 == 0) 
		x = 2 * x;
	    summa = summa + x/10 + x%10;
	}
	if (summa % 10 == 0) 
	    System.out.println("RÄTT PNR: " + args[0]);
	else 
	    System.out.println("FEL PNR: " + args[0]);
    }
}

Anropet ord.indexOf(tkn) returnerar -1 om tecknet inte finns i ordet. Det är användbart för att känna igen vokaler - något som behövs i vissa hemliga språk såsom A-språket.
// Jag heter olle    översätts till
// Jag hatar alla
class Aspraket {
    public static void main(String[] args) {
	String vokaler = "aeiouyåäö";
	while(!Mio.eof()) {
	    char tkn = Mio.getChar();
	    if (vokaler.indexOf(tkn) > -1)
		tkn = 'a';
	    System.out.print(tkn);
	}
    }
}


^ Upp till kurssidan.


Sidansvarig: <efo@nada.kth.se>
Senast ändrad 6 november 2000
Tekniskt stöd: <webmaster@nada.kth.se>