מחרוזות – הטיפוס String מוטי בן-ארי, רגוניס נוע המחלקה להוראת המדעים מכון ויצמן למדע
Copyright © Moti Ben-Ari, Noa Ragonis מה שזה לא !! הטיפוס String מוגדר מראש כטיפוס לכל דבר. עצם מטיפוס String אינו מערך של תווים!! (ניתן להמיר מן האחד לשני.) עצם מטיפוס String הוא קבוע שאי-אפשר לשנות על ידי פנייה לתווים בודדים!! עיבוד מחרוזות מתבצע ע"י פירוק לתת-מחרוזות והרכבה בשרשור. קיים טיפוס StringBuffer הדומה למחרוזות המוכרות מ-Pascal ו-C. לא נהוג להשתמש בו. Copyright © Moti Ben-Ari, Noa Ragonis
Copyright © Moti Ben-Ari, Noa Ragonis מחרוזת כעצם String s = “abcde”; String t = “fghi”; קיימת גם פעולה יוצרת המייצרת מחרוזת חדשה ממחרוזת קיימת. t abcde fghi s Copyright © Moti Ben-Ari, Noa Ragonis
Copyright © Moti Ben-Ari, Noa Ragonis מחרוזת כעצם - השמה s = t; קיים "איסוף זבל" (garbage collection) למחזור הזיכרון. abcde fghi s t Copyright © Moti Ben-Ari, Noa Ragonis
Copyright © Moti Ben-Ari, Noa Ragonis מחרוזת כעצם - השוואה String s = “abcde”; t = “abcde”; String u = “ab”; v = “cde”; w = u+v; ( s == t ) // true !! ( s == w ) // false !! ( s.equals(w) ) // true abcde s w Copyright © Moti Ben-Ari, Noa Ragonis
Copyright © Moti Ben-Ari, Noa Ragonis המלצות להשתמש ב-String. לבצע השוואות ע"י equals. לייצר מחרוזות חדשות ע"י שרשור, אפילו שרשור של המחרוזת הריקה! String t = s + “”; לא תמיד חייבים לייצר משתנה: setText(title + “ “ + version); Copyright © Moti Ben-Ari, Noa Ragonis
Copyright © Moti Ben-Ari, Noa Ragonis הקצאת זיכרון ב-C (ו-C++) הקצאה "מופקרת" של זיכרון. ב-Pascal ו-C++, הקצאת זיכרון של עצמים (רשומות), ושחרור ידני. סכנה של "זליגת זיכרון" (memory leaks). ב-Java הקצאה של עצמים. אין שחרור ידני. s = null; איסוף זבל מתבצע באופן אוטומטי "מאחורי הקלעים", לכן אין זליגה. סכנה של פגיעה בזמן תגובה בתכניות. Copyright © Moti Ben-Ari, Noa Ragonis
Copyright © Moti Ben-Ari, Noa Ragonis שרשור פעולת השרשור מוגדרת על ידי האופרטור +. שרשור מייצר עצם חדש: s = s + “***” + t + ‘\n’; צ'ופר רציני: כל ערך עובר המרה אוטומטית למחרוזת כאשר + מופיע: int count = …; System.out.println(“Count is = “ + count); Copyright © Moti Ben-Ari, Noa Ragonis
Copyright © Moti Ben-Ari, Noa Ragonis הפעולה toString ההמרה מתבצעת ע"י זימון סמוי לפעולה toString של העצם. ניתן לשנות פעולה זו כנדרש: class Pepper { public String toString() { return “Size = “ + size + “, color = “ + color + “, weight (kg) = “ + weight; } Copyright © Moti Ben-Ari, Noa Ragonis
Copyright © Moti Ben-Ari, Noa Ragonis הפעולה length לכל מחרוזת קיימת פעולה length(), המחזירה את האורך של המחרוזת. דוגמה: System.out.println( “The size of “ + s + “ is “ + s.length() ); Copyright © Moti Ben-Ari, Noa Ragonis
מחרוזת לעומת מערך (length) שים לב!! מחרוזת היא עצם שעליה מוגדרת פעולה ללא פרמטרים length(). if (s.length() > 0) …. לכל מערך קיימת תכונה length. int[] a = new int[10]; for (int i = 0; i < a.length; i++) Copyright © Moti Ben-Ari, Noa Ragonis
Copyright © Moti Ben-Ari, Noa Ragonis גישה לתווים בודדים ניתן לקרוא תווים בודדים לפי מיקומם, אך אי-אפשר לשנות אותם: for (int i = 0; i < s.length(); i++) if (s.charAt(i) == ‘*’) count++; Copyright © Moti Ben-Ari, Noa Ragonis
Copyright © Moti Ben-Ari, Noa Ragonis השוואות בין מחרוזות equals מחזיר boolean. compareTo משווה שתי מחרוזות לפי סדר lexicographic. הפונקציה מחזירה int: if (s.compareTo(t) < 0) // s before t else if (s.compareTo(t) > 0) // s after t else // s same as t Copyright © Moti Ben-Ari, Noa Ragonis
פעולות מגוונות בטיפוס String חיפושים: startsWith , endsWith, indexOf, lastIndexOf. שליפת תת-מחרוזת: substring. צמצום רווחים בקצוות: trim. אותיות גדולות/קטנות: toLowerCase, toUpperCase. Copyright © Moti Ben-Ari, Noa Ragonis
דוגמה – מחיקת תת-מחרוזת String delete(String s, int from, int to) { String start = s.substring(0, from); String end = s.substring(to+1); return start + end; } s = delete(s, 4, 7); from to length-1 Copyright © Moti Ben-Ari, Noa Ragonis
דוגמה – הכנסת תת-מחרוזת String insert(String s, String sub, int at) { String start = s.substring(0, at); String end = s.substring(at); return start + sub + end; } s = insert(s, " the", 4); at length-1 Copyright © Moti Ben-Ari, Noa Ragonis
Copyright © Moti Ben-Ari, Noa Ragonis class ReverseWords { static String s = "The quick brown fox jumped over the lazy dog"; static String t = ""; public static void main(String[] args) { int space = s.lastIndexOf(' '); while (space != -1) { t = t + s.substring(space+1) + " "; s = s.substring(0, space); space = s.lastIndexOf(' '); } t = t + s; System.out.println(t); Copyright © Moti Ben-Ari, Noa Ragonis