In Java if you want to sort the characters in a String alphabetically it is very easy:
      | String test = "sorting";char[] chars = test.toCharArray();
 Arrays.sort(chars);
 System.out.println(new String(chars)); // prints out "ginorst"
 | 
But how can we do this in Flex/ActionScript?  Perhaps there is an easier way than this, but here are my utility functions that sorts the characters in a String by putting each character into an array, sorting the array, then joining the array back into a String.
      | /*** Converts the string's characters into an array.
 * @param string the string to convert into an array
 * @param unique if true then only unique characters are added to the array
 * @param ignoreCase only applies if the unique property is set to true
 */
 public static function toCharArray(string:String, unique:Boolean = false,
 ignoreCase:Boolean = false):Array {
 var array:Array = new Array();
 if ((string != null) && (string.length > 0)) {
 // for tracking unique letters
 var seen:Object = new Object();
 // add each character to the array
 for (var i:int = 0; i < string.length; i++) {
 var char:String = string.charAt(i);
 if (unique) {
 // unique characters only, possibly ignoring case
 // use the character code as the key (could just use the letter too)
 var key:String = (ignoreCase ? char.toUpperCase() : char);
 key = key.charCodeAt(0).toString(10);
 if (!seen.hasOwnProperty(key)) {
 seen[key] = true;
 array.push(char);
 }
 } else {
 array.push(char);
 }
 }
 }
 return array;
 }
 
 /**
 * Sorts the characters in the string alphabetically.
 * @param ignoreCase if false (default) upper case letters come first then lowercase
 * @param descending if true then the String is sorted in reverse
 * @param unique if true then only unique characters are sorted and returned
 */
 public static function sort(string:String, ignoreCase:Boolean = false,
 descending:Boolean = false, unique:Boolean = false):String {
 // no point in sorting
 if ((string == null) || (string.length <= 1)) {
 return string;
 }
 var chars:Array = toCharArray(string, unique, ignoreCase);
 var options:uint = 0;
 if (ignoreCase) {
 options = options | Array.CASEINSENSITIVE;
 }
 if (descending) {
 options = options | Array.DESCENDING;
 }
 chars.sort(function(s1:String, s2:String):int {
 return ObjectUtil.stringCompare(s1, s2, ignoreCase);
 }, options);
 
 var sorted:String = chars.join("");
 return sorted;
 }
 | 
Feel free to comment if you know of a simpler way to sort characters in a String.
No comments:
Post a Comment