Pages

January 17, 2006

StringBuilder מחלקת

אני מחזיר את השוט של אינדיאנה ג'ונס לג'ינס ונח על ענף עץ בינארי, בכדי לספר לכם על מחלקה חדשה ויעילה המשפרת ביצועים וגם עושה חיים קלים. ממש גלולת ויאגרה לנזקקים או שמא שאחטה לסאטלני המחרוזות.
מדובר במחלקת StringBuilder הנמצאת תחת flash.util ובהחלט שווה איזכור. למעשה מדובר במחלקה אשר "מחקה" את התנהגות String עם מספר שינויים מהותיים.
ראשית, StringBuilder (מעתה sb) היא הרבה יותר חסכונית מבחינת זכרון, כמו שעוד מעט נווכח. שנית, יש לה מתודות חדשות המקלות על המינפולציות עליה, כמו... שעוד מעט נראה.
יודעים מה, בואו נראה כבר עכשיו:

לפני שאציג את קטע הקוד שבא ליישם את כל הנפלאות, אני אסביר מה קורה שם:
הדרך ליצור sb היא פשוטה כמו כל יצירת מופע, כאשר הפרמטר אותו אנו מעבירים הוא המחרוזת עצמה.
היתרון הגדול של המחלקה הזו היא בניהול המשאבים שלה. בעוד שכאשר אנו מוסיפים מחרוזת למחרוזת באובייקט String(ע"י האופרטור +=) אנחנו למעשה נוטשים את מיקום הזכרון הישן עבור המחרוזת הישנה, ויוצרים חדש המכיל את השרשור, sb יודעת להשתמש באותו מיקום זכרון ופשוט להוסיף לו כנדרש כאשר היא מותירה עוד אסטרה-מקום בשביל הוספות נוספות. דוגמה לכך אפשר לראות בפונקציה: addText.

ישנן מספר מתודות אשר מפשטות תהליכים מסובכים, כמו: remove, removeCharAt, replace (הפועלת שונה, מהמתודה בעלת אותו השם של String). דוגמאות לכך אפשר לראות בפונקציות:replacePortion removePortion, removeChar,.

בנוסף להכל, ישנה מתודה אשר מצמצמת את מספר התווים המשומש, ובכך מקטינה את ניצול הזכרון הנקראת: trimToSize. את הקיבולת אפשר לראות בעזרת המאפיין capacity שהוא read-only. מה שכן, אחרי שביצעתי אותה, משום מה trace לא הציגה את המחרוזת יותר. Bug?... לא יודע, צריך לברר.

בכל אופן, הנה הדוגמאות, מקווה שתמצאו אותן מועילות לכם. אני פשוט חייב לרוץ להציל את הבחורה, להיפטר מהרעים ולהחזיר את הכובע לניקוי יבש.



package {
import flash.display.*;
import flash.util.*;

public class StringBuilderExample extends Sprite {
private var my_str:String
private var my_sb:StringBuilder;
public function StringBuilderExample () {
// Create a simple string
my_str = "My name is Chuck Norris, and I shall kick your ass";
// Create a String Builder instance
my_sb = new StringBuilder ("My name is Chuck Norris, and I shall kick your ass");

// Manipulate -----

// Add text
addText (" this is an add on string");
// Remove a portion of the string
removePortion (4, 14);
// Remove a specific char
removeChar (5)
// Replace a portion with string
replacePortion (10, 11, "FRIZZLE FRY")
// Trim capacity
trimCapacity ()
}
protected function addText (add_str:String):Void {
my_str += add_str;
trace ("my_str", my_str);
// The new String takes a new memory allocation
// leaving the old one there and unused.

my_sb.append (add_str)
trace ("my_sb", my_sb);
// Flash uses the same memory allocation and adds
// to it, leaving space for more data to be added
}
protected function removePortion (startIndex:int, endIndex:int):Void {
trace ("before:", my_sb)
// Desplays: My name is Chuck Norris, and I
// shall kick your ass this is an add on string
my_sb.remove(startIndex, endIndex);
trace ("after:", my_sb)
// Desplays: My nck Norris, and I shall kick
// your ass this is an add on string
}
protected function removeChar (charIndex:int):Void {
trace ("before:", my_sb)
// Desplays: My nck Norris, and I shall kick
// your ass this is an add on string
my_sb.removeCharAt(charIndex);
trace ("after:", my_sb)
// Desplays: My nc Norris, and I shall kick
// your ass this is an add on string
}
protected function replacePortion (startIndex:int, endIndex:int, rpl_str:String):Void {
trace ("before:", my_sb)
// Displays: My nc Norris, and I shall kick
// your ass this is an add on string
my_sb.replace (startIndex, endIndex, rpl_str);
trace ("after:", my_sb)
// Displays: My nc NorrFRIZZLE FRYs, and I shall
// kick your ass this is an add on string
}
protected function trimCapacity ():Void {
// The chars capacity before triming
trace (my_sb.capacity) // Diplays: 102
// Trim to fit
my_sb.trimToSize ();
// The chars capacity after triming
trace (my_sb.capacity) // Displays: 74
// A bug?
trace (my_sb) // Displays: Nothing
trace (my_sb.toString()) // Displays: Nothing
}
}
}

אני אבקש שוב את סליחתכם על תצוגת הקוד הדלה ש-blogger מציע.

No comments: