Grundläggande En sträng är en sekvens av tecken (text). t) För att ange ett strängvärde omgärdar man det med dubbelfnuttar: Exempel på strängvärden: "Ångström" "1256" "ABC123" Man kan slå ihop strängar, det kallas för konkatenering. k Operatorn plus (+) gör konkatenering: k "Polack" + "sbacken" blir strängvärdet "Polacksbacken" "1256" + "78" blir strängvärdet "125678" 1
Strängvariabler (klassen String) I en strängvariabel kan man lagra strängvärden. Exempel, vi deklarerar och initierar två strängvariabler: String s = "Lena"; String t = "Bo Ek"; Teknen i en sträng är lagrade på varsitt index (position) s består av 4 tecken, det finns därför 4 olika index Index 0 i s har teckenvärdet 'L' Index 1 i s har teckenvärdet 'e' Ett blanktecken (mellanslag) på Index 2 i s har teckenvärdet 'n' index 2 Index 3 i s har teckenvärdet 'a' Index 0-4 i t har värdena 'B','o',' ','E','k'. Hur man kommer åt de enskilda tecknen i en sträng kommer ni se alldeles strax 2
Javasatser String s = "Lena"; String t = "Bo Ek"; Strängvariabler I datorns minne lagras tecknen i en sekvens. Eftersom varje tecken i Java kräver två byte behövs 8 byte för "Lena" s 'L' 'e' 'n' 'a' t 'B 'o' ' ' 'E' 'k' I minnet lagras information om innehållet i strängen 3
Vi fortsätter exemplet String s1 = "Lena"; String s2 = "Bo Ek"; String adress = " Skolgatan 33"; String s3, s4; //2 nya strängar får värdet null s3 = s1 + adress; // s3 tilldelas värde s3 får värdet "Lena Skolgatan 33"; s4 = s1 + "-" + s2; s4 får värdet "Lena-Bo Ek"; + mellan strängar betyder s.k. konkatenering, dvs hopkedjning 4
Eftersom String är en klass finns det Metoder för strängar Längden av en sträng int len = s3.length(); Tag reda på ett tecken i ett givet index (4) char t = s3.charat(5); Gör om alla tecken till versaler s3 = s3.touppercase(); 2. Vänsterledet säger att s3 skall tilldelas ett värde som finns i högerledet. Dvs s3 innehåller samma tecken som tidigare, men alla gemener ändras till versaler.. t får värdet 'S' S 1. Java gör högerledet först: Omvandla alla gemener i strängen tä s3 till versaler 5
Inläsning av strängar Givet att vi gjort: Scanner input = new Scanner(System.in) kan vi läsa in en hel rad med text t med nextline via Interactions: String namn1, namn2; System.out.println("Namn?"); namn1 = input.nextline(); // Läser hela raden Eller läsa in text ordvis med next: System.out.println("Namn?"); namn2 = input.next(); // Läser ett ord Med Popup kan man läsa in en hel rad med text: Om texten består av t.ex. blanka tecken, så avgränsas ord av dessa blanka. String namn; namn = JOptionPane.showInputDialog(null,"Namn?"); 6
Eftersom String är en klass har den en konstruktor Ett exempel: String s1 = new String("Torsten"); String s2 = new String("Torstina"); Java har förenklat det lite genom att ovan är ekvivalent med följande: String s1 = "Torsten"; String s2 = "Torstina"; Varje gång vi tilldelar ett nytt värde till en String-variabel innebär alltså ett nytt objekt skapas med konstruktorn. s1 = "Kim"; // Anropa konstruktorn Detta innebär att referensen till det förra objektet tappas bort. s1 refererar nu till ett nytt objekt. 7
String s1 = "Torsten"; String s2 = "Torstina"; Att jämföra strängar if (s1==s2) { } Innebär att referenserna jämförs, vilket normalt alltid blir false. Jämförelser kan göras med följande metoder: s1.equals(s2) s1.compareto(s2) 8
Konvertering från tal till String Genom konkatenering int x=12; String s = "x är " + x; s blir därmed "x är 12" Med klassmetoden valueof i klassen String: int x=12; String s = String.valueOf(x); s blir därmed "12" Med klassmetoden format i klassen String: double y=4.3569999; String s = String.format("%7.2f", y); S blir därmed " 4.36" s består av 7 tecken och talet avrundas till två decimaler Klassmetod är en metod som man anropar genom att ange klassen namn, mer om det på annan plats, jämför med anrop av metoder i klassen Math. 9
Konvertering från String till tal Kan göras med hjälp av parsemetoderna: String s = "2.5"; double d = Double.parseDouble(s); s = "kim 22 år"; double b = Double.parseDouble(s); Blir naturligtvis fel Kan göras med Scannerklassen String s = "13 3,5 12 Pia"; Scanner sc = new Scanner(s); int x =sc.nextint(); // x blir 13 double y = sc.nextdouble(); // y blir 3.5 int z = sc.nextint(); // z blir 12 String s = sc.next(); // S blir "Pia" 10
Metoder på strängar Alla metoder för strängvariabler finns dokumenterade här: http://docs.oracle.com/javase/7/docs/api/java/lang/string.html 11
Övningar på strängar (utförs enklast i Interactions) Övn 1. Testa följande: String s1="abba"; String s2="bbba"; Testa följande sats, skriv ut värdet på tal int tal = s1.compareto(s2); Testa med: tal = s2.compareto(s1); // Vad blir tal? Och s2="abba"; tal = s1.compareto(s2); Enklast gör du en utskrift av en variabels värde genom att bara skriva variabelns namn på en tom rad följt av ENTER. Och s2="abba"; tal = s1.compareto(s2); // Vad blir tal? Vad tror ni att compareto beräknar? 12
Övn 2 (utförs enklast i Interactions) String s1="abba"; String s2="abba"; Skriv ut värdet på resultat boolean resultat t = s1.equals(s2); // Vad blir resultat? t? resultat = s2.equals(s1); // Vad blir resultat? Testa med: s2="acba"; resultat = s1.equals(s2); // Vad blir resultat? Testa med: s2="abba"; resultat = s1.equals(s2); // Vad blir resultat? Kuriosa: Att jämföra strängvariabler med == fungerar INTE. Testa med logiskt uttryck: boolean lika = s1==s2; Värdet blir alltid false. Det beror på att s1 är en referensvariabel och samma sak för s2, och dessa värden är inte lika (dvs referenserna är inte lika). Vad tror ni att equals beräknar? Vad är skillnaden mellan compareto och equals? 13
Övn 3 (utförs enklast i Interactions) : Testa följande: String ramsa = "Sex laxar i en laxask"; String s; s=ramsa.substring(4,7); Vad blir värdet av s? Testa att använda substring på lite andra sätt genom att variera parametervärdena (inom parentesen) Hur tror ni att substring fungerar? Testa följande: int i; i=ramsa.indexof("s"); i=ramsa.indexof("lax"); i=ramsa.indexof("gädda"); Hur tror ni att indexof fungerar? Man kan även använda indexof med två st parametrar. Exempel: String s2="bla etc bla bla"; int j=s2.indexof("bla",4); Kommer att leta efter "bla" från position 4. j får värdet 8. Fundera på (men skriv inga javasatser) hur man skulle kunna ta reda på hur många ggr som lax förekommer i texten. 14
Övn 4 (utförs enklast i Interactions) Testa följande: String ramsa = "Sex laxar i en laxask"; ramsa = ramsa.replacefirst("x","xtio"); ramsa = ramsa.replaceall("lax","mört"); Vad blir värdet av ramsa? Hur tror ni replacefirst och replaceall fungerar? 15
Övn 5 - Ja/Nej konversation (utförs enklast i Interactions) Läs igenom koden och testa sedan följande: import java.util.*; Scanner input = new Scanner (System.in); System.out.println("Svara Ja eller Nej"); String svar = input.nextline(); if (svar.equals("ja")) { System.out.println("Du svarade Ja"); } else if (svar.equals("nej")) { System.out.println("Du svarade Nej"); } else { System.out.println("Du svarade varken Ja eller Nej"); } 16
Övn 6 - Alt Ja/Nej konversation (utförs enklast i Interactions) Läs igenom koden och testa sedan: import java.util.*; Scanner input = new Scanner (System.in); System.out.println("Svara t tl Ja eller Nej"); String svar = input.nextline(); // Plocka ut 1:a tecknet från svar char c = svar.charat(0); if (c=='j') { System.out.println("Du t tl svarade Ja!"); } else if (c=='n'){ System.out.println("Du svarade Nej!"); } else { System.out.println("Du svarade varken Ja eller Nej"); } 17
Övn 7: Bygg upp en sträng teckenvis (utförs enklast i Interactions) String s = ""; // Börja med en tom sträng Skapa ett slumptecken char slump; // Tecknet får värdet 'A' - 'Z' // Fråga läraren om det är oklart med nedan sats slump = (char) ('A' + (int) (26*Math.random()) ); Bygg på strängen med slumptecknet s = s + slump; Vad blir värdet av s? Bör bli bara ett tecken Fortsätt nu med följande två satser (tips: använd uppåtpil för att repetera satser) : slump = (char) ('A' + (int) (26*Math.random()) ); s = s + slump; Upprepa de två satserna några ggr Och skriv ut värdet av s. 18
Övn 8: Lagra en uppsats i en Sträng (utförs enklast i Interactions) En text kan lagras i en String-variabel. I variabeln finns radbytena med genom att vi lagrar specialtecknet \n. Exempel: String visa = "Imse vimse... \n Ned... \n Upp...\n Imse...\n"; Lägg in hela satsen ovan i DrJava. Skriv ut variabeln visa. Visst kom radbytena med Man kan även få med TAB-tecken i en text. Skriver då: \t 19
Övning 9 kryptering (utförs enklast i Interactions) Vi skall kryptera strängen s som är "Pia". Läs först igenom följande satser och försök förstå vad de gör. Klistra sedan in alla satserna i DrJava och bekräfta att det fungerar och att resultatet s2 blir Qjb, dvs Pia krypteras till Qjb String s = "Pia"; String s2 = ""; // s2 är tom initialt char teck; // Behöver en teckenvariabel teck = s.charat(0); // 1:a tecknet i s (P) lagras i teck teck++; //addera 1, dvs ändra P till Q, en trivial kryptering s2 = s2 + teck; // s2 blir "Q" teck = s.charat(1); // 2:a tecknet teck++; // ändra 2:a tecknetet s2 = s2 + teck; // s2 är nu "Qj" teck = s.charat(2); // 3:e tecknet teck++; // ändra s2 = s2 + teck; // s2 är nu "Qjb" 20
Övning 10 - Loopa igenom en sträng (utförs enklast i Interactions) Eftersom vi vet hur lång en sträng är mha metoden length() kan vi skapa en loop som går igenom tecken för tecken i en sträng. Här är ett exempel som går igenom en sträng och räknar antalet bokstäver som är ett 'a'' (gemener). String s = "Torsten Andersson"; char ch; int antal=0; // Räknare för antal 'a'' // Loopa igenom strängen s från position 0 till // positionen som är strängens längd minus 1 for (int i=0; i<s.length(); i++) { ch = s.charat(i); //plocka ut tecknet på pos i if (ch=='a') {// Om tecknet är a, uppdatera räknaren antal++; } } System.out.println("Antal a är:"+ antal); Klistra in dessa satser i Interactions och tryck på enter så kommer alla satser att utföras. 21
Övning 11 - kryptering mha loop (utförs enklast i Interactions) Det blir enklare att lösa krypteringen (från Övn 9) med en loop som går igenom tecken för tecken i strängen String s = "Pia ", s2 = ""; char ch; // tecken i strängen // loopa igenom strängen, tecken för tecken for (int i=0; i<s.length(); i++ ) { ch = s.charat(i); //plocka ut tecknet på pos i ch++; // kryptera tecknet s2 = s2 + ch; // bygg upp resultatet } System.out.println("Krypterad:"+ s2); Klistra in dessa satser i Interactions och tryck på enter så kommer alla satser att utföras. Resultatet bör bli att strängen "Pia " bör bli "Qjb!. Blanktecknet blir ett utropstecken. 22
Övning 12: Exempel på analys av text: Räkna ord i en uppsats (finns i t.ex. Word). Fundera på hur man skulle kunna räkna ord i en sträng. Skriv inga satser bara fundera ut en princip i (algoritm) Läsbarhetsindex (LIX) är ett mått som är baserat på medeltalet ord per mening och andelen långa ord (ord med fler än 6 bokstäver) Nyfiken på detta? Läs mer om LIX på http://sv.wikipedia.org/wiki/lix Testa att utföra en beräkning av LIX för en godtycklig text via en LIX-kalkylator: http://www.lix.se/ 23