1 Hoofdstuk 11: Strings en karakters
Inleiding In dit hoofdstuk bespreken we de mogelijkheden van de klassen : String StringBuffer Character StringTokenizer Deze klassen vormen de basis voor string- en karakterbewerking in Java.
Fundamenten van karakters en Strings Een karakter wordt intern opgeslagen door zijn overeenkomstige Unicode (zie appendix B). Deze Unicode is een integerwaarde. Voorbeeld : char kar=‘z’; Intern : kar 122
Fundamenten van karakters en Strings (vervolg) Een string is een reeks van karakters die als één geheel wordt beschouwd. Kan bestaan uit letters, getallen en andere speciale karakters (+, -,*,…). Een string is een object van de klasse String. Voorbeeld : String z=“Eddy Wally”; Intern : z Eddy Wally
Klasse String String-constructoren De klasse String voorziet negen constructors om String-objecten te initialiseren (zie Fig.11.1).
6 1 // Fig. 11.1: StringConstructors.java 2 // Dit programma demonstreert String klasse constructoren. 3 4 // Java extension packages 5 import javax.swing.*; 6 7 public class StringConstructors 8 { 9 // test String constructoren 10 public static void main( String args[] ) 11 { 12 char charArray[] = { 'b', 'i', 'r', 't', 'h', ' ', 13 'd', 'a', 'y' }; 14 byte byteArray[] = { ( byte ) 'n', ( byte ) 'e', 15 ( byte ) 'w', ( byte ) ' ', ( byte ) 'y', 16 ( byte ) 'e', ( byte ) 'a', ( byte ) 'r' }; StringBuffer buffer; 19 String s, s1, s2, s3, s4, s5, s6, s7, output; s = new String( "hello" ); 22 buffer = new StringBuffer( "Welcome to Java Programming!" ); 23 Een StringBuffer is string met een dynamische grootte en wijzigbaar
7 24 // gebruik String constructors 25 s1 = new String(); 26 s2 = new String( s ); 27 s3 = new String( charArray ); 28 s4 = new String( charArray, 6, 3 ); 29 s5 = new String( byteArray, 4, 4 ); 30 s6 = new String( byteArray ); 31 s7 = new String( buffer ); // voeg Strings toe aan output 34 output = "s1 = " + s1 + "\ns2 = " + s2 + "\ns3 = " + s "\ns4 = " + s4 + "\ns5 = " + s5 + "\ns6 = " + s "\ns7 = " + s7; JOptionPane.showMessageDialog( null, output, 39 "Demonstrating String Class Constructors", 40 JOptionPane.INFORMATION_MESSAGE ); System.exit( 0 ); 43 } } // einde klasse StringConstructors
String-constructoren (vervolg) s1 = new String(); =>lege string s1 s2 = new String(s); => s2 s hello
String-constructoren (vervolg) s4 = new String(charArray,6,3); s4 charArray day b | i | r | t | h | | d| a| y offset =start aantal
String-methodes methode “length()” : geeft het aantal karakters van een String weer Voorbeeld : s1.length() NIET s1.length (zoals bij arrays) Eerste karakter in een String begint bij positie 0! h a m b u r g e r
String-methodes methode “charAt(pos)” : geeft het karakter op de positie pos terug methode “getChars(start,laatste,naar,vanafpos)” : kopieert de karakters van een bepaalde String vanaf positie start t.e.m. laatste-1, in de array naar vanaf index vanafpos
12 1 // Fig. 11.2: StringMiscellaneous.java 2 // Dit programma demonstreert de length, charAt en getChars 3 // methodes van de String klasse. 4 import javax.swing.*; 5 6 public class StringMiscellaneous 7 { 8 public static void main( String args[] ) 9 { 10 String s1= "hello there“; 11 char charArray[]= new char[ 5 ];; String output = "s1: " + s1; // test length methode 16 output += "\nLength of s1: " + s1.length(); Bepaal aantal karakters in String s1
13 18 // loop door karakters in s1 en toon ze in omgekeerde volgorde 19 output += "\nThe string reversed is: "; for ( int count = s1.length() - 1; count >= 0; count-- ) 22 output += s1.charAt( count ) + " "; // kopieer karakters van string naar charArray 25 s1.getChars( 0, 5, charArray, 0 ); 26 output += "\nThe character array is: "; for ( int count = 0; count < charArray.length; count++ ) 29 output += charArray[ count ]; JOptionPane.showMessageDialog( null, output, 32 “String class character manipulation methods", 33 JOptionPane.INFORMATION_MESSAGE ); System.exit( 0 ); 36 } } // einde klasse StringMiscellaneous
Strings vergelijken Java voorziet een aantal methodes om String-objecten met elkaar te vergelijken. Wanneer de computer twee strings met elkaar vergelijkt, dan worden eigenlijk de interne numerieke codes van alle karakters in de strings met elkaar vergeleken. String s1 is groter dan String s2 => s1 komt alfabetisch na s2
15 1 // Fig. 11.3: StringCompare.java 2 // String methodes equals,equalsIgnoreCase, compareTo, en regionMatches 3 import javax.swing.JOptionPane; 4 5 public class StringCompare 6 { 7 public static void main( String args[] ) 8 { 9 String s1 = new String( "hello" ); 10 String s2 = "good bye"; 11 String s3 = "Happy Birthday"; 12 String s4 = "happy birthday"; output = "s1 = " + s1 + "\ns2 = " + s "\ns3 = " + s3 + "\ns4 = " + s4 + "\n\n"; // test voor gelijkheid 18 if ( s1.equals( "hello" ) ) 19 output += "s1 equals \"hello\"\n"; 20 else 21 output += "s1 does not equal \"hello\"\n"; 22 Methode equals test twee objecten op gelijkheid gebruikmakend van lexicographical comparison
16 23 // test voor gelijkheid met == 24 if ( s1 == "hello" ) 25 output += "s1 equals \"hello\"\n"; 26 else 27 output += "s1 does not equal \"hello\"\n"; // test voor gelijkheid (ignore case) 30 if ( s3.equalsIgnoreCase( s4 ) ) 31 output += "s3 equals s4\n"; 32 else 33 output += "s3 does not equal s4\n"; // test compareTo 36 output +="\ns1.compareTo( s2 ) is " + s1.compareTo( s2 ) + 37 "\ns2.compareTo( s1 ) is " + s2.compareTo( s1 ) + 38 "\ns1.compareTo( s1 ) is " + s1.compareTo( s1 ) + 39 "\ns3.compareTo( s4 ) is " + s3.compareTo( s4 ) + 40 "\ns4.compareTo( s3 ) is " + s4.compareTo( s3 ) +"\n\n"; // test regionMatches (hoofdletter-gevoelig) 43 if ( s3.regionMatches( 0, s4, 0, 5 ) ) 44 output += "First 5 characters of s3 and s4 match\n"; 45 else 46 output +="First 5 characters of s3 and s4 do not match\n"; Test twee objecten op gelijkheid, maar negeert hoofd- of kleine letters in String Methode compareTo vergelijkt String objecten Methode regionMatches vergelijkt delen van twee String objecten op gelijkheid Gelijkheidsoperator ( == ) test of beide referenties naar hetzelfde object in het geheugen refereren
17 48 // test regionMatches (ignore case) 49 if ( s3.regionMatches( true, 0, s4, 0, 5 ) ) 50 output += "First 5 characters of s3 and s4 match"; 51 else 52 output +="First 5 characters of s3 and s4 do not match"; JOptionPane.showMessageDialog( null, output, 55 "String comparisons",JOptionPane.INFORMATION_MESSAGE ); System.exit( 0 ); 58 } } // einde klasse StringCompare
Strings vergelijken (vervolg) equals() : test of twee objecten identiek zijn (methode overgeërfd van de klasse Object) => Geeft true of false terug, naargelang alle karakters uit de String-objecten gelijk zijn of niet (Het zijn de Unicode-waarden die worden vergeleken).
Strings vergelijken (vervolg) operator == : test of twee referentie- variabelen naar hetzelfde object in het geheugen wijzen. => Het zijn de adressen in de referentie- variabelen naar de Strings die vergeleken worden, niet de inhoud van de Strings! Voorbeeld : s1=“hello”; s1==“hello”? s1=new String(“hello”);
Strings vergelijken (vervolg) equalsIgnoreCase() : test of twee String- objecten identiek zijn, maar houdt geen rekening met hoofd- en kleine letters => Geeft true of false terug compareTo() => Geeft 0 terug als de Strings dezelfde zijn of een negatief/positief getal terug als ze verschillend zijn
Strings vergelijken (vervolg) regionMatches() : vergelijkt delen van twee String-objecten Voorbeeld : s1.regionMatches(0, s4, 0, 5) => vergelijk de vijf eerste karakters uit s1 met die van s4 0=start in s1 0=start in s4 5= aantal karakters => Geeft true of false terug
22 1 // Fig. 11.4: StringStartEnd.java 2 // Stringmethodes startsWith en endsWith. 3 import javax.swing.*; 4 5 public class StringStartEnd 6 { 7 public static void main( String args[] ) 8 { 9 String strings[] = {"started", "starting", "ended", "ending" }; 10 String output = ""; // test methode startsWith 13 for ( int count = 0; count < strings.length; count++ ) if ( strings[ count ].startsWith( "st" ) ) 16 output += "\"" + strings[ count ]+"\"starts with \"st\"\n"; output += "\n"; 19 Methode startsWith bepaalt of de String begint met bepaalde karakters
23 20 // test methode startsWith beginnend op positie 21 // 2 van de string 22 for ( int count = 0; count < strings.length; count++ ) if ( strings[ count ].startsWith( "art", 2 ) ) 25 output+= "\"" + strings[ count ] + 26 "\" starts with \"art\" at position 2\n"; output += "\n"; // test methode endsWith 31 for ( int count = 0; count < strings.length; count++ ) if ( strings[ count ].endsWith( "ed" ) ) 34 output += "\"" + strings[ count ] + "\" ends with \"ed\"\n"; JOptionPane.showMessageDialog( null, output, 37 "String Class Comparisons",JOptionPane.INFORMATION_MESSAGE ); System.exit( 0 ); 40 } } // einde klasse StringStartEnd Methode endsWith bepaalt of String eindigt met bepaalde karakters
Strings vergelijken (vervolg) startsWith(string) => Geeft true of false terug, al naargelang het String-object begint met string. endsWith(string) => Geeft true of false terug, al naargelang het String-object eindigt met string.
Localiseren van Karakters en Substrings in Strings Methode indexOf: zoekt het eerste voorkomen van een karakter in een String. Voorbeeld : letters.indexOf(‘c’) => geeft de index van het karakter c in de String letters weer, of => geeft -1 terug, als het karakter niet in de String voorkomt Voorbeeld : letters.indexOf(‘c’,7) : idem, maar nu wordt pas gestart vanaf index 7 in letters
Localiseren van Karakters en Substrings in Strings (verv.) Methode indexOf: kan ook gebruikt worden om een substring in een String te zoeken. Methode lastIndexOf : idem indexOf, alleen wordt nu het laatste voorkomen van een karakter weergegeven. (Zoekt van achter naar voor in de String)
27 1 // Fig. 11.5: StringIndexMethods.java 2 // String zoekmethodes indexOf en lastIndexOf. 3 import javax.swing.*; 4 5 public class StringIndexMethods 6 { 7 public static void main( String args[] ) 8 { 9 String letters = "abcdefghijklmabcdefghijklm"; // test indexOf om een karakter in een string te localiseren 12 String output = "'c' is located at index " + letters.indexOf( 'c' ); output += "\n'a' is located at index " + letters.indexOf( 'a', 1 ); output += "\n'$' is located at index " + letters.indexOf( '$' ); // test lastIndexOf om een karakter in een string te vinden 19 output += "\n\nLast 'c' is located at index " + 20 letters.lastIndexOf( 'c' ); output += "\nLast 'a' is located at index " + 23 letters.lastIndexOf( 'a', 25 ); 24 Methode indexOf vindt eerste voorkomen van karakter in String Methode lastIndexOf vindt laatste voorkomen van karakter in String
28 25 output += "\nLast '$' is located at index " + 26 letters.lastIndexOf( '$' ); // test indexOf om een substring in een string te zoeken 29 output += "\n\n\"def\" is located at index " + 30 letters.indexOf( "def" ); output += "\n\"def\" is located at index " + 33 letters.indexOf( "def", 7 ); output += "\n\"hello\" is located at index " + 36 letters.indexOf( "hello" ); // test lastIndexOf om een substring in een string te vinden 39 output += "\n\nLast \"def\" is located at index " + 40 letters.lastIndexOf( "def" ); output += "\nLast \"def\" is located at index " + 43 letters.lastIndexOf( "def", 25 ); output += "\nLast \"hello\" is located at index " + 46 letters.lastIndexOf( "hello" ); JOptionPane.showMessageDialog( null, output, 49 "String searching methods", JOptionPane.INFORMATION_MESSAGE ); System.exit( 0 ); 52 } } // einde klasse StringIndexMethods Methodes indexOf en lastIndexOf kunnen ook voorkomens van substrings vinden
29
Substrings uit Strings halen Methode substring => maakt uit een bestaande String een nieuwe String. Voorbeeld : letters.substring(20) => geeft een nieuwe String weer, die een substring is van letters, beginnend vanaf index 20. Voorbeeld : letters.substring(start,last) : geeft substring uit letters terug, kopie van karakters van index start t.e.m. index last-1
31 1 // Fig. 11.6: SubString.java 2 // String klasse substring methodes. 3 import javax.swing.*; 4 5 public class SubString 6 { 7 public static void main( String args[] ) 8 { 9 String letters = "abcdefghijklmabcdefghijklm"; // test substring methodes 12 String output = "Substring from index 20 to end is " + 13 "\"" + letters.substring( 20 ) + "\"\n"; output += "Substring from index 0 up to 6 is " + 16 "\"" + letters.substring( 0, 6 ) + "\""; JOptionPane.showMessageDialog( null, output, 19 "String Substring Methods", JOptionPane.INFORMATION_MESSAGE ); System.exit( 0 ); 22 } } // einde klasse SubString Beginnend op index 20, haal karakters uit String letters Haal karakters van index 0 tot 6 uit String letters
Concateneren van Strings Methode concat => geeft een nieuwe String terug, die een concatenatie is van twee Strings. Voorbeeld : s1.concat(s2) => geeft een nieuwe String weer, die een samenvoeging is van s1 en s2. s1 en s2 worden niet gewijzigd bij deze operatie!
33 1 // Fig. 11.7: StringConcatenation.java 2 // String concat methode. 3 import javax.swing.*; 4 5 public class StringConcatenation 6 { 7 public static void main( String args[] ) 8 { 9 String s1 = new String( "Happy " ), 10 s2 = new String( "Birthday" ); String output = "s1 = " + s1 + "\ns2 = " + s2; output += "\n\nResult of s1.concat( s2 ) = " + s1.concat( s2 ); 15 output += "\ns1 after concatenation = " + s1; JOptionPane.showMessageDialog( null, output, 18 "String method concat", JOptionPane.INFORMATION_MESSAGE ); System.exit( 0 ); 21 } } // einde klasse StringConcatenation Concateneer String s2 en String s1
Verscheidene String- methodes Methode replace => geeft een nieuwe String terug, die een kopie is van de originele, maar waarin een bepaald karakter vervangen is door een ander. Methode toUpperCase => geeft een nieuwe String terug, die een kopie is van de originele, maar waarin alle karakters nu in hoofdletters staan.
Verscheidene String- methodes (vervolg) Methode toLowerCase => geeft een nieuwe String terug, die een kopie is van de originele, maar waarin alle karakters nu in kleine letters staan. Methode trim => geeft een nieuwe String terug, die een kopie is van de originele, maar waarin alle spaties vooraan en achteraan zijn verwijderd.
Verscheidene String- methodes (vervolg) Methode toCharArray => kopieert alle karakters uit een String naar een array bestaande uit chars. Voorbeelden : zie fig
37 1 // Fig. 11.8: StringMiscellaneous2.java 2 // String methodes replace, toLowerCase, toUpperCase, trim en toCharArray 3 import javax.swing.*; 4 5 public class StringMiscellaneous2 6 { 7 public static void main( String args[] ) 8 { 9 String s1 = new String( "hello" ), 10 s2 = new String( "GOOD BYE" ), 11 s3 = new String( " spaces " ); String output = "s1 = " + s1 + "\ns2 = " + s2 + "\ns3 = " + s3; // test methode replace 16 output += "\n\nReplace 'l' with 'L' in s1: " + 17 s1.replace( 'l', 'L' ); // test toLowerCase en toUpperCase 20 output += "\n\ns1.toUpperCase() = " + s1.toUpperCase() + 21 "\ns2.toLowerCase() = " + s2.toLowerCase(); // test trim methode 24 output += "\n\ns3 after trim = \"" + s3.trim() + "\""; 25 Gebruik methode toUpperCase om een kopie van s1 terug te geven waarin elk karakter een hoofdletter is Gebruik methode trim om een kopie van s3 terug te geven waarin elke spatie is verwijderd Gebruik methode toLowerCase om een kopie van s2 terug te geven waarin elk karakter een kleine letter is Gebruik methode replace om een kopie van s1 terug te geven, waarin elke ‘ l ’ vervangen is door ‘ L ’
38 26 // test toCharArray methode 27 char charArray[] = s1.toCharArray(); 28 output += "\n\ns1 as a character array = "; for ( int count = 0; count < charArray.length; ++count ) 31 output += charArray[ count ]; JOptionPane.showMessageDialog( null, output, 34 “Additional String methods", JOptionPane.INFORMATION_MESSAGE ); System.exit( 0 ); 37 } } // einde klasse StringMiscellaneous2 Gebruik methode toCharArray om karakter array bestaande uit de karakters van s1 terug te geven
String-methode valueOf De klasse String voorziet een aantal static klasse-methodes, die argumenten van verschillende types kunnen converteren naar Strings. Methode valueOf => geeft een nieuwe String terug, die de String-representatie voorstelt van een primitief datatype of ander object.
40 1 // Fig. 11.9: StringValueOf.java 2 // String valueOf methodes. 3 import javax.swing.*; 4 5 public class StringValueOf 6 { 7 public static void main( String args[] ) 8 { 9 char charArray[] = { 'a', 'b', 'c', 'd', 'e', 'f' }; 10 boolean booleanValue = true; 11 char characterValue = 'Z'; 12 int integerValue = 7; 13 long longValue = ; 14 float floatValue = 2.5f; 15 double doubleValue = ; 16 Object objectRef = "hello"; // toekenning aan Object referentie String output = "char array = " + String.valueOf( charArray ) + 19 "\npart of char array = " + String.valueOf( charArray, 3, 3 ) + 20 "\nboolean = " + String.valueOf( booleanValue ) + 21 "\nchar = " + String.valueOf( characterValue ) + 22 "\nint = " + String.valueOf( integerValue ) + 23 "\nlong = " + String.valueOf( longValue ) + 24 "\nfloat = " + String.valueOf( floatValue ) + 25 "\ndouble = " + String.valueOf( doubleValue ) + 26 "\nObject = " + String.valueOf( objectRef ); JOptionPane.showMessageDialog( null, output, 29 "String valueOf methods", JOptionPane.INFORMATION_MESSAGE ); 31 System.exit( 0 ); 32 } 33 } // einde klasse StringValueOf static methode valueOf van klasse String geeft String -voorstelling van verschillende types terug
41
42 Oefeningen Vind het middenste karakter van de string “hottentottententoonstelling”. Gegeven zijn een voornaam en een achternaam. Druk de initialen van deze naam af. Ga na of een willekeurig woord een palindroom is.