Föreläsning 6. Fält. Fält Klassen String. Fält

Relevanta dokument
I ett program hantera man ofta samlingar av objekt av samma typ.

Föreläsning 7. Fält Klassen String

Fält och klassen String

Objektorienterad programmering

Föreläsning 7. Föreläsning 7

Föreläsning 7. Föreläsning 7. Fält Klassen String. Fält Klassen String. Fält. I ett program hantera man ofta samlingar av objekt av samma typ.

for-satsen Fält for-satsen Föreläsning 8 (OH-bilder 7) for-satsen for-sats är en styrsats för iterationer. for-sats har följande generella utseende:

Föreläsning 7. for-satsen Fält

Föreläsning 8. Klassen String Mer om fält Klassen ArrayList

Klassen String Mer om fält Något om inläsning

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

Föreläsning 3-4 Innehåll

Repetition av OOP- och Javabegrepp

Repetition av OOP- och Javabegrepp

Instuderingsfrågor, del D

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

EDAA20 Föreläsning Klassen ArrayList. Viktiga operationer på ArrayList. Generisk klass

Tvådimensionella fält

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Lösningsförslag: Instuderingsfrågor, del D

Föreläsning 3. Iteration while-satsen

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 12

String [] argv. Dagens Agenda. Mer om arrayer. Mer om arrayer forts. String [] argv. argv är variabelnamnet. Arrayer och Strängar fortsättning

Uppgift: Algoritm för att beräkna kontrollsiffran i ett personnummer givet de 9 första siffrorna. Torrsimning av algoritm för personnummer

Tentamen DE12, IMIT12, SYST12, ITEK11 (även öppen för övriga)

Föreläsning REPETITION & EXTENTA

Institutionen för TENTAMEN CTH VT-15 Datavetenskap TDA540. Tentamen för TDA540 Objektorienterad programmering

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy. Funktioner / metoder. Punktnotation. Evalueringsordning

Tentamen i Grundläggande Programvaruutveckling, TDA548

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Lösningsförslag till tentamen

Dagens text. Programmeringsteknik. Mer om Scanner-klassen. Dialogrutor (klassen JOptionPane) Bubbelsortering. Omslagsklasser.

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Typkonvertering. Java versus C

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

Institutionen för TENTAMEN CTH HT-14 Datavetenskap TDA540. Tentamen för TDA540 Objektorienterad programmering

Föreläsning 10 OM DELMÅLSKONTROLLEN ; VARIABLERS SYNLIGHET STRING OCH STRINGBUILDER

Namn: Personnr: 1 2D1310 Programmeringsteknik i Java för B,V (1p) 13 januari 2001, kl Hjälpmedel: En Javabok. För betyget godkänt krävs at

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Tentamen , Introduktion till Java, dtaa98, dtea53

Mer om klasser och objekt

Exempel. Arrayer. Lösningen. Ett problem. Arrayer och hakparanteser. Arrayer

Lösningsförslag: Instuderingsfrågor, del A

Föreläsning Innehåll. Hantera många element. Exempel: polygon Godtyckligt antal element. Exempel: polygon forts

Enkla variabler kontra referensvariabel

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-16, TDA540. Dag: , Tid:

Iteration while-satsen

Tentamen OOP

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

Ett problem. Kontrollstrukturer och arrayer. Arrayer. Lösningen. Arrayer och hakparanteser. Exempel int[] results; results = new int[10]; // 0..

TENTAMEN OOP

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

PROGRAMMERING-Java TENTAMINA

Dagens text. Programmeringsteknik. Mer om Scanner-klassen. Dialogrutor (klassen JOptionPane) Bubbelsortering. Omslagsklasser.

(Man brukar säga att) Java är... Denna föreläsning. Kompilering av Java. Historik: Java. enkelt. baserat på C/C++ Allmänt om Java

Föreläsning 8 SLUMPTAL, SIMULERING + INTRODUKTION TILL VEKTORER

Föreläsning 3. Iteration. while-satsen for-satsen do-satsen

Objektorienterad programmering E. Algoritmer. Telefonboken, påminnelse (och litet tillägg), 1. Telefonboken, påminnelse (och litet tillägg), 2

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

1 Uppgift 1. a) Skapar ett Company-objekt med hjälp av den överlagrade konstruktorn. Du kan själv välja värden på instansvariablerna.

Malmö högskola 2008/2009 CTS

Exempel på listor (klassen ArrayList). Ett exempel med fält. Avbildning är en speciell typ av lista HashMap.

TDIU01 - Programmering i C++, grundkurs

TENTAMEN OOP

Objektorienterad programmering. Fält som funktionsresultat. Mer om fält: att uppdatera ett parameterfält. Kontrast: Parametrar av primitiv typ

Den som bara har en hammare tror att alla problem är spikar

Arrayer. results

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

[] Arrayer = Indexerad variabel

TDDC77 Objektorienterad Programmering

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

Objektorienterad programmering Föreläsning 9. Copyright Mahmud Al Hakim Agenda (halvdag)

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Arrayer (fält)

Tentamen i Grundläggande Programvaruutveckling, TDA548

Lösningsförslag till tentamen

Kapitel 6. Hakparenteser fšr att ange index MŒnga všrden av samma typ

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

Objekt som argument. Föreläsning 7-8 Innehåll. Hur komma åt den andra kvadratens attribut? Anropa metod på objektet självt

Algoritmer. Två gränssnitt

Introduktion till Datalogi DD1339. Föreläsning 2 22 sept 2014

Programmering för språkteknologer II, HT2011. Rum

Saker du ska kunna Föreläsning 13 & 14

Datastrukturer. Erik Forslin. Rum 1445, plan 4 på Nada

Anteckningar 1: Grundläggande saker

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

Tentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-15, TDA540. Dag: , Tid:

Objektorienterad programmering D2

Hej Då, Karel! Programmering. Vårt första Javaprogram. hh.se/db2004. Java. Grundtyper, variabler och arrayer

Objektorienterad programmering i Java

JAVAUTVECKLING LEKTION 8

Föreläsning 7-8 Innehåll

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Exempelduggan. Luffarschack. Koda spel

PROGRAMMERING-JAVA TENTAMINA

Lösningsförslag till tentamen

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Parsing med Recursive Descent, Avbildningsklasser. Syntaxdiagram. Syntaxdiagram och kodning expression. Betrakta följande uttryck

Transkript:

Föreläsning 6 Fält Fält Klassen Klassen String String Fält I ett program hantera man ofta samlingar av objekt av samma typ. Sådana samlingar vill man vanligtvis kunna gruppera ihop till en sammanhängande struktur. För detta ändamål tillhandahåller Java språkkonstruktioner för att hantera fält.

Fält Ett fält är en numrerad samling av element, där varje element är av samma datatyp och elementen selekteras med index. Ett fält är ett objekt som nås via en referens list [] list = new [5]; Indexering sker alltid från 0. Oinitierade heltal får värdet 0. 0 0 0 0 0 list[0] list[1] list[2] list[3] list[4] Varje enskilt element i ett fält kan handhas individuellt via sitt index: list list[0] = list[1] = 5; list[2] = 6; 1 5 6 4 3 list[3] = 4; list[4] = 3; list[0] list[1] list[2] list[3] list[4] Fält Istället för att skapa ett fält med new kan fältet skapas genom att initiera värden till fältet vid deklarationen. Antalet värden som då deklareras bestämmer fältets storlek. list2 [] list2 ={10, 8, 2, 12}; 10 8 2 12 list2[0] list2[1] list2[2] list2[3] Längden av ett fält fås av instansvariabeln length list2 nrofelements = list2.length; list2.length 10 8 2 12 list2[0] list2[1] list2[2] list2[3]

Fält Fält kan skapas av godtycklig typ. double [] numbers = new double[20]; String[] names = {"Adam", "Beda", "Cesar", "David", "Erik", "Fabian"}; String[] word = new String[4]; word[1] = "hej"; word Oinitierade elemnet får värdet. 'h' 'e' 'j' Fält Tilldelning ger ingen kopia, utan en referens till samma fält! listone [] listone = {10, 12, 4, 14, 32}; [] listtwo = listone; listtwo 10 12 Satsen listtwo[2] = 15; resulterar således i att även elementet listone[2] får värdet 15! listone listtwo 10 12 15 14 32 4 14 32

Fält Tilldelning ger ingen kopia, utan en referens till samma fält! alist [] alist = {2, 3, 4, 8, 9}; [] anotherlist = {2, 3, 4, 8, 9}; 2 3 4 8 9 2 3 4 8 9 anotherlist Jämförn alist == anotherlist ger resultatet false, eftersom det är värdet i variablerna alist och anotherlist som jämförs och e värdet som dessa variabler refererar till!! Klassen java.util.arrays I klassen java.util.arrays finns ett antal klassmetoder som är användbara när man arbetar med endimensionella fält: Metod Beskrivning boolean equals([] a, [] b) erar true om fälten a och b är lika långa och motsvarande komponenter är lika, annars eras false. [] copyof([] f, length) erar en kopia av fältet f med längden length. Om kopian är kortare än f sker en trunkering, om kopian är längre fylls kopian ut med 0:or. [] copyofrange([] f, from, to) erar ett fält som innehåller elementen från index from till index to i fältet f. String tostring([] f) erar en textrepresentation av fältet f, på formen [e1, e2,..., en] void fill([] f, value) sätter alla element i fältet f till värdet value. void fill([] f, from, to, value) sätter alla elementen från index from till index to i fältet f till värdet value.

Klassen java.util.arrays Metod Beskrivning void sort([] f) sorterar elementen i fältet f i stigande ordning void sort([] f, from, to) sorterar element från index from till index to i fältet f i stigande ordning. void binarysearch([] f, key) erar index för key om key finns i fältet f, annars eras ett värde < 0. Observera att fältet f måste vara sorterat! void binarysearch([] f, from, to, key) erar index för key om key finns i fältet f mellan index from och index to annars eras ett värde < 0. Samtliga dessa metoder finns också för andra typer av fält, t.ex. double[], boolean[] och char[]! Användning av metoder i java.util.arrays Exempel: Att sortera och skriva ut ett fält import java.util.arrays;... [] list ={5, 4, 3, 8, 1, 9, 6, 7, 2}; Arrays.sort(list); System.out.prln(Arrays.toString(list)); Utskriften som erhålls blir: [1, 2, 3, 4, 5, 6, 7, 8, 9] Exempel: Att lokalisera ett element i ett sorterat fält import java.util.arrays;... [] list ={5, 4, 3, 8, 1, 9, 6, 7, 2}; Arrays.sort(list); //sortera fältet index = Arrays.binarySearch(list, 9); if (index >= 0) System.out.prln("Talet 9 finns i index " + index); System.out.prln("Talet 9 finns INTE i fältet!"); Observera att sortering kan innebära att man förstör fältet, ifall om den inbördes ordningen av elementen i fältet har betyd för applikationen.

Att genomlöpa ett fält. För att genomlöpa alla elementen i ett fält används normalt en for- loop [] list = new [20];... for ( i = 0; i < list.length; i = i + 1) { // gör de bearbetningar av elementen // som skall göras } Exempel: Summera talen i heltalsfältet list //pre: list!= static sumofelements([] list) { sum = 0; for ( i = 0; i < list.length; i = i + 1) { sum = sum + list[i]; } sum; }//sumofelements Att söka i ett osorterat fält. Implementation av en metod som erar true om ett visst värde finns i ett givet fält, annars erar metoden false. Ett första försök: Använd en for-sats för genomsökning av hela listan list list!=!= static static boolean boolean isinlist([] isinlist([] list, list, target) target) {{ boolean boolean found found == false; false; for for ( ( index index == 0; 0; index index << list.length; list.length; index index == index index ++ 1) 1) {{ ifif (target (target == == list[index]) list[index]) {{ found found == true; true; Nu har vi funnit det vi söker found; found; }//isinlist }//isinlist När När vi vi funnit funnit vad vad vi vi söker söker fortsätter fortsätter sökningen sökningen ändock ändock till till slutet slutet av av listan! listan! Onödigt! Onödigt! Sluta Sluta när när vi vi hittat hittat vad vad vi vi söker! söker! Innan vi börjar sökningen har vi e funnit vad vi söker

Att söka i ett osorterat fält. En bättre lösning: Använd en while-sats och sluta när vi funnit det vi söker list list!=!= static static boolean boolean isinlist([] isinlist([] list, list, target) target) {{ index index == 0; 0; boolean boolean found found == false; false; while while (index (index << list.length list.length && &&!found)!found) {{ ifif (target (target == == list[index]) list[index]) {{ found found == true; true; index index == index index ++ found; found; Avbryter sökningen när vi funnit det vi söker eller då hela fältet är genomsökt }//isinlist }//isinlist Att söka i ett osorterat fält. Alternativa implementationer list list!=!= static static boolean boolean isinlist([] isinlist([] list, list, target) target) {{ index index == 0; 0; while while (index (index << list.length) list.length) {{ if if (target (target == == list[index]) list[index]) {{ true; true; list list!=!= index index == index index ++ static static boolean boolean isinlist([] isinlist([] list, list, target) target) {{ index index == 0; 0; while false; false; while (index (index << list.length list.length && && target target!=!= list[index]) list[index]) {{ index }//isinlist index == index index ++ }//isinlist index index << list.length; list.length; }//isinlist }//isinlist

Att söka i ett osorterat fält. Implementation av metoder som erar första respektive sista index för ett givet värde om värdet finns i ett givet fält, annars eras -1. (Varför -1?) list list!=!= static static firstindexof([] firstindexof([] list, list, target) target) {{ index index == 0; 0; while while (index (index << list.length list.length && && target target!=!= list[index]) list[index]) {{ index index == index index ++ list list!=!= ifif ((index index << list.length) list.length) static lastindexof([] static lastindexof([] list, list, target) target) {{ index; index = list.length = list.length while while (index (index >= >= 00 && && target target!=!= list[index]) list[index]) {{ - index == index -- index index }//firstindexof }//firstindexof index; index; }//lastindexof }//lastindexof Eget bibliotek med fältmetoder. De metoder vi implementerat ovan är handhar situationer som är vanligt återkommande delproblem i många skilda sammanhang. Det är därför mycket lämpligt all lägga dessa metoder i en och samma klass så att de kan återanvändas i olika tillämpningar. Här placerar vi metoderna i en klass med namnet ArrayUtils. class class ArrayUtils ArrayUtils {{ //// Metoden Metoden erar erar värdet värdet true true om om target target finns finns ii fältet fältet list, list, //// annars annars erar erar metoden metoden värdet värdet false. false. //// förvillkor: förvillkor: list list static static boolean boolean isinlist([] isinlist([] list, list, target) target) {{...... //// Metoden Metoden erar erar index index för för första första förekomsten förekomsten av av target target //// ii fältet fältet list, list, finns finns e e target target ii list list eras eras värdet värdet -1-1 //// förvillkor: förvillkor: list list static static firstindexof([] firstindexof([] list, list, target) target) {. {....}.} //// Metoden Metoden erar erar index index för för sista sista förekomsten förekomsten av av target target //// ii fältet fältet list, list, finns finns e e target target ii list list eras eras värdet värdet -1-1 //// förvillkor: förvillkor: list list static static lastindexof([] lastindexof([] list, list, target) target) {. {....}.}...... }//ArrayUtils }//ArrayUtils

Problemexempel Skriv en metod static [] removeallduplicates([] list) som tar ett heltalsfält list och erar ett nytt fält vilket innehåller samma element som list där alla eventuella dubbletter är borttagna. Exempel: Antag att följande deklaration har gjorts [] vekt = {1, 4, 1, 2, 4, 5, 12, 3, 2, 4, 1}; ett anrop av removeallduplicates(vekt) skall era ett fält med följande utseende {1, 4, 2, 5, 12, 3}. Design: Förvillkor: list!= Diskussion: Vi börjar med att skapar ett nytt fält, som vi kan kalla newlist. Sedan tar vi ett element i taget från fältet list och lägger i detta element i newlist om elementet e redan finns i newlist. Algoritm: 1. nrofstoredelements = 0; 2. så länge det finns fler element kvar i list 2.1. if (nästa elenent i list e finns i newlist ) 2.1.1. newlist[nrofstoredelements] = nästa element i list; 2.1.2. nrofstoredelements = nrofstoredelements + 3. Returnera den ett fält som innehåller elementen som lagrats i newlist Datarepresentation: newlist är av datatypen []. nrofstoredelements är av datatypen.

Implementation: import import java.util.*; java.util.*; class class NoDublicate NoDublicate {{ Genomsök endast den del av list list!=!= fältet som innehåller element private private static static [] [] removeallduplicates([] removeallduplicates([] list) list) {{ [] [] newlist newlist == new new [list.length]; [list.length]; nrofstoreelements nrofstoreelements == 0; 0; for for ( ( ii == 0; 0; ii << list.length; list.length; ii == ii ++ 1) 1) {{ nextelement nextelement == list[i]; list[i]; ifif (!ArrayUtils.isInList(Arrays.copyOf(newList, (!ArrayUtils.isInList(Arrays.copyOf(newList, nrofstoreelements), nrofstoreelements), nextelement)) nextelement)) {{ newlist[nrofstoreelements] newlist[nrofstoreelements] == nextelement; nextelement; nrofstoreelements Returnera endast den del av nrofstoreelements == nrofstoreelements nrofstoreelements ++ fältet som innehåller element Arrays.copyOf(newList, Arrays.copyOf(newList, nrofstoreelements); nrofstoreelements); Huvudprogram för att }//removeallduplicates }//removeallduplicates static static void void main(string[] main(string[] args) args) {{ [] [] vekt vekt == {1, {1, 4, 4, 1, 1, 2, 2, 4, 4, 5, 5, 12, 12, 3, 3, 2, 2, 4, 4, 1}; 1}; [] [] result result == removeallduplicates(vekt); removeallduplicates(vekt); System.out.prln(Arrays.toString(result)); System.out.prln(Arrays.toString(result)); }//main }//main }//NoDublicate }//NoDublicate testa metoden Parallella fält. Två fält kallas för parallella fält om den data som finns i motsvarande index i de båda fälten är logiskt relaterade till varandra på något sätt. Exempel: Antag att vi har en golftävling med 5 deltagare. Vi kan lagra deltagarnas namnen i en fält, deltagarnas startnummer i ett annat fält och deltagarnas resultat i ett tredje fält: String[] name = new String[5]; [] startnr = new [5]; [] score = new [5]; name startnr score "Kalle" 4 74 "Anna" 5 67 "Stina" 2 73 "Åsa" 1 70 "Sven" 3 68 Är dessa fält parallella gäller att varje index k i fältet namn är relaterat till index k i fälten startnr och score, dvs "Stina" hade startnummer 2 och gick banan på 73 slag. Obs: I just detta exempel hade det varit bättre att skapat en klass GolfPlayer med instansvariablerna name, startnr samt score och istället använt ett enda fält med objekt av denna klass.

Fält som uppslagstabeller. Fält kan användas som uppslagstabeller //pre: //pre: none none static static String String getweekday( getweekday( daynumberofweek) daynumberofweek) {{ if if (daynumberofweek (daynumberofweek == == 1) 1) "Monday"; "Monday"; ifif (daynumberofweek (daynumberofweek == == 2) 2) "Tuesday"; "Tuesday"; ifif (daynumberofweek (daynumberofweek == == 3) 3) "Wednesday"; "Wednesday"; ifif (daynumberofweek (daynumberofweek == == 4) 4) "Thursday"; "Thursday"; ifif (daynumberofweek (daynumberofweek == == 5) 5) "Friday"; "Friday"; ifif (daynumberofweek (daynumberofweek == == 6) 6) "Saturday"; "Saturday"; ifif (daynumberofweek (daynumberofweek == == 7) 7) "Sunday"; "Sunday"; "Illegal "Illegal day day number!"; number!"; }//getweekday }//getweekday //pre: //pre: daynumberofweek daynumberofweek >= >= 11 && && daynumberofweek daynumberofweek <= <= 77 static static String String getweekday( getweekday( daynumberofweek) daynumberofweek) {{ final final String[] String[] weekdays weekdays == {"Monday", {"Monday", "Tuesday", "Tuesday", "Wednesday", "Wednesday", "Thursday", "Thursday", "Friday", "Saturday", "Saturday", "Sunday"}; "Sunday"}; weekdays[daynumberofweek weekdays[daynumberofweek -- 1]; 1]; }//getweekday }//getweekday Parametrar till main. Metoden main har en parameterlista som utgörs av ett fält av strängar: static void main(string[] args) Detta innebär att man kan ge indata till main-metoden via parameterlistan. Betrakta main-metoden i klassen Demo nedan. Vad main gör är att skriva ut de strängar som finns i dess parameter args. class class Demo Demo {{ static static void void main(string[] main(string[] args) args) {{ for for ( ( i == 0; 0; ii << args.length; args.length; ii == i + 1) 1) System.out.prln("Argument System.out.prln("Argument "" ++ ii ++ "" == "" ++ args[i]); args[i]); }//main }//main }//Demo }//Demo Innehåller parametern args strängarna "Anna", "Beda" och "Doris" blir utskriften Argument 0 = Anna Argument 1 = Beda Argument 2 = Doris

Parametrar till main. Argumenten till main-metoden ges när exekveringen av programmet startas. Startas exekveringen från kommandofönstret skriver man alltså java Demo Anna Beda Doris Sker exekveringen från jgrasp skapar man ett kommandorad i vilket argumenten ges, genom att trycka på "Run Arguments" i menyn "Run". Standardklassen String Texter handhas i Java med standardklassen String. Ett objekt av klassen String består av en följd av tecken, dvs element av typen char. Ett objekt av klassen String kan e förändras efter att det har skapats, dvs objekten är icke-muterbara. String - char[] value - count +String() +String(char[] value) +length() : double +charat( index) :... Internt i klassen String lagras teckensträngen i ett teckenfält.

Metoder i standardklassen String Metod Beskrivning length() ger antal tecken i strängen char charat( pos) ger tecknet i position pos indexof(char c) ger index för första förekomsten av tecknet c, om c e finns eras -1 lastindexof(char c) ger index för sista förekomsten av tecknet c, om c e finns eras -1 indexof(string str) ger index för första förekomsten av strängen str, om str e finns eras -1 lastindexof(string str) ger index för sista förekomsten av strängen str, om str e finns eras -1 ger true om den aktuella strängen och strängen str är lika, annars eras false. jämför aktuell sträng med strängen str utan hänsyn till versaler och germaner. ger true om den aktuella strängen och strängen str är lika, annars eras false. boolean equals(string str) boolean equalsignorecase(string str) String trim() ger en kopia av strängen där inledande och avslutande blanktecken är borttagna Metoder i standardklassen String Metod Beskrivning compareto(string str) gör alfabetisk jämför mellan aktuell sträng och str. Ger värdet 0 om aktuell sträng och argumentet är alfabetiskt lika, ett värde mindre än 0 om argumentet är större och ett värde större än 0 om argumentet är mindre String concat(string str) ger en sträng där str har lagts till efter aktuell sträng String replace(char old, char new) ger en kopia av den aktuella strängen där alla förekomster av tecknet old har bytts ut mot tecknet new String substring( start) ger delsträngen från position start till slutet av strängen String substring( start, end) ger delsträngen börjar i position start och slutar i position end-1 String tolowercase(string str) ger en kopia av strängen där alla versaler har bytts mot gemener String touppercase(string str) ger en kopia av strängen där alla gemener har bytts mot versaler char[] tochararray() erar strängen som ett fält av tecken static String value( n) erar texten som motsvarar heltalet n Fler metoder finns i klassen String.

Metoder i standardklassen Character Metod Beskrivning getnumericvalue(char ch) ger Unicode för ch boolean isdigit(char ch) ger värdet true om ch är en siffra, annars eras värdet false boolean isletter(char ch) ger värdet true om ch är en bokstav, annars eras värdet false boolean isletterordigit(char ch) ger värdet true om ch är en siffra eller bokstav, annars eras värdet false boolean islowercase(char ch) ger värdet true om ch är en liten bokstav, annars eras värdet false boolean isuppercase(char ch) ger värdet true om ch är en stor bokstav, annars eras värdet false char tolowercase(char ch) om ch är en stor bokstav eras motsvarande lilla bokstav annars eras ch char touppercase(char ch) om ch är en liten bokstav eras motsvarande stora bokstav annars eras ch Standardklassen String I Java används en ernationell standard för att lagra tecken som kallas Unicode. De svenska tecknen ligger e i följd i denna standard, varför e svenska tecken och svenska ord kan jämföras enligt alfabetisk ordning med metoden compareto i klassen String. Istället måste en särskild jämförare användas. En jämförare är ett objekt av klassen Collator, som finns i paketet java.text. En jämförare deklareras på följande sätt: Collator co = Collator.getInstance(new Locale("sv", "SE")); där new Locale("sv", "SE") definierar de språkkonventioner som skall användas. Klassen Locale finns i paketet java.util.

Standardklassen String Texter kan jämföras med metoderna compare eller equals: co.compare(s1,s2) ger värdet 0 om s1 och s2 är alfabetiskt lika, ett värde < 0 om s1 kommer för s2 och ett värde > 0 om s2 kommer för s1. co.equals(s1, s2) ger true om s1 och s2 är alfabetiskt lika, annars fås värdet false. Det är möjligt att sätta "nivån" på jämföraren: co.setstrength(collator.primary) skiljer endast på olika bokstäver. co.setstrength(collator.secondary) skiljer på utsmyckade bokstäver. co.setstrength(collator.tertiary) skiljer på utsmyckade bokstäver, samt på små och stora bokstäver. Problemexempel Skriv ett Java-program som läser en mening från terminalen och räknar antalet vokaler, konsonanter och siffror. Analys: Indata: En sträng av godtyckliga tecken. Utdata: Utskrift av hur många vokaler, konsonanter respektive siffror som finns i den inlästa strängen. Exempel: Strängen "1xfg2ÄåÖabcdeHI,% 3" ger utskriften: Antalet vokaler är 6 Antalet konstanter är 7 Antalet siffror är 3

Design: Att beräkna antalet siffror, antalet konsonanter respektive antalet vokaler är tre separata delproblem, varför vi skriver en metod för var och ett av dessa delproblem: getnrofdigits(string str) erar antalet siffror i strängen str getnrofvowels(string str) erar antalet vokaler i strängen str getnrofconsonants(string str) erar antalet konsonanter i strängen str Algoritm för huvudprogrammet: 1. Läs strängen indata 2. antsiffror = getnrofdigits(indata); 3. antvokaler = getnrofvowels(indata); 4. antkonsonanter = getnrofconsonants(indata); 5. Skriv ut antvokaler, antkonsonanter och antsiffror Datarepresentation: indata är av datatypen String antsiffror, antvokaler, antkonsonanter är av typen. Diskussion: fortsättning För att avgöra om ett tecken är en siffra finns metoden isdigit i klassen Character. Algoritmen för metoden getnrofdigits(string str) blir därför: 1. Sätt number = 0 2. För varje tecken ch i str 2.1. if (Character.isDigit(ch)) number = number + 3. number För att avgöra om ett tecken är en bokstav finns metoden isletter i klassen Character. Vi behöver dock särskilja om en bokstav är en vokal eller en konsonant varför vi inför en metod: boolean isvowel(char ch) false erar true om ch är en vokal, annars Algoritmen för metoden getnrofvowels(string str) blir därför: 1. Sätt number = 0 2. För varje tecken ch i str 2.1. if (isvowel(ch)) number = number + 3. number

Diskussion: fortsättning Algoritmen för metoden getnrofconsonants(string str) blir: 1. Sätt number = 0 2. För varje tecken ch i str 2.1. if (Character.isLetter() &&!isvowel(ch)) number = number + 3. number I metoden boolean isvowel(char ch) deklarerar vi en sträng som innehåller de bokstäver som är vokaler: String vowels = "aeiouyåäö"; För att avgöra om tecknet ch är en vokal använder vi metoden indexof på strängen vowels. Anropet vowels.indexof(ch) ger värdet -1 om tecknet ch e finns bland de tecken som ingår i strängen vowels, annars ger anropet ett heltal större eller lika med 0. Eftersom strängen vowels innehåller endast de "små" vokalerna, men ch givetvis kan vara en "stor" vokal måste ch översättas till sin "lilla" motsvarighet. Detta görs med metoden tolowercase som finns i klassen Character. Implementation: Huvudprogrammet import import javax.swing.*; javax.swing.*; class class Count Count {{ static static void void main(string[] main(string[] args) args) {{ while(true) while(true) {{ String String indata indata == JOptionPane.showInputDialog("Ge JOptionPane.showInputDialog("Ge en en mening: mening: "); "); ifif (indata (indata == == ) ) break; break; nrofvowels nrofvowels == getnrofvowels(indata); getnrofvowels(indata); nrofconsonants nrofconsonants == getnrofconsonants(indata); getnrofconsonants(indata); nrofdigits nrofdigits == getnrofdigits(indata); getnrofdigits(indata); JOptionPane.showMessageDialog(, JOptionPane.showMessageDialog(, "Antalet "Antalet vokaler vokaler är är "" ++ nrofvowels nrofvowels ++ "\nantalet "\nantalet konsonanter konsonanter är är "" ++ nrofconsonants nrofconsonants ++ "\nantalet "\nantalet siffror siffror är är "" ++ nrofdigits); nrofdigits); }//while }//while }//main str str!=!= }//main private private static static getnrofdigits(string getnrofdigits(string str) str) {{ number number == 0; 0; for for ( ( pos pos == 0; 0; pos pos << str.length(); str.length(); pos pos == pos pos ++ 1) 1) {{ ifif (Character.isDigit(str.charAt(pos))) (Character.isDigit(str.charAt(pos))) number number == number number ++ number; number; }//getnrofdigits }//getnrofdigits

Implementation: fortsättning private static boolean isvowel(char ch) { String vocals = "aeiouyåäö"; char smallch = Character.toLowerCase(ch); if (vocals.indexof(smallch)!= -1) str str!=!= true; private private static static getnrofvowels(string getnrofvowels(string str) str) {{ number number == 0; 0; false; for for ( ( pos pos == 0; 0; pos pos << str.length(); str.length(); pos pos == pos pos ++ 1) 1) {{ }//isvowel ifif (isvowel(str.charat(pos))) (isvowel(str.charat(pos))) number number == number number ++ number; number; }//getnrofvowels }//getnrofvowels str str!=!= private private static static getnrofconsonants(string getnrofconsonants(string str) str) {{ number number == 0; 0; for for ( ( pos pos == 0; 0; pos pos << str.length(); str.length(); pos pos == pos pos ++ 1) 1) {{ char char ch ch == str.charat(pos); str.charat(pos); ifif (Character.isLetter(ch) (Character.isLetter(ch) && &&!isvowel(ch))!isvowel(ch)) number number == number number ++ number; number; }//getnrofconsonants }//getnrofconsonants }//Count }//Count