2011-02-06 370 views
1

我有一個按字母順序排列的數組;Android陣列排序

[0] = apple 
[1] = banana 
[2] = mango 
[2] = melon 

我現在需要做的是什麼,是字符串數組分割成帶有字母的羣體較小的字符串數組,所以輸出會是:

[0] = apple 

[0] = banana 

[0] = mango 
[1] = melon 

我已經嘗試了一些方法,但他們都是無望的,你能給我一段代碼來做到這一點嗎?我保證給出最好的答案和所有好答案一個點!

+0

什麼是你正在努力實現的實際任務?你可以用一個簡單的循環來實現這一點,但是對於整體問題可能有更好的解決方案。 – Dori 2011-02-06 16:39:09

回答

1

你肯定會想用更好的方式來存儲數據,而不是數組...也許一個TreeMap或只是一個字符串列表:

String[] arr = new String[]{"apple", "banana", "mango", "melon"}; 
List<List<String>> arrs = new ArrayList<List<String>>(); 
char f = 0; 
List<String> last = null; 
for(String s : arr){ 
    if(f != s.charAt(0)){ 
     f = s.charAt(0); 
     // since first the char is different, create a new array 
     last = new ArrayList<String>(); 
     last.add(s); 
     if(last != null){ 
      arrs.add(last); 
     } 
    } 
    else { 
     last.add(s); 
    } 
} 

在上述情況下,你會有一個字符串列表清單(arrs)。有關列表的好處是它們的大小是動態的(數組維度是靜態的)。

+0

非常感謝,非常有幫助! – 2011-02-06 19:53:16

2

這是我會怎麼做:

  1. 創建有序映射(例如一個TreeMap)與第一個字符爲重點,和值水果的清單

  2. 迭代通過原陣列。

  3. 在每次迭代中,提取第一炭和看到,如果圖包含它作爲一個密鑰。如果沒有,請創建一個空的水果列表,並將其放置在地圖中。把目前的水果在列表中(無論是已經在地圖與否)

  4. 詢問地圖的價值:它是水果名單的有序集合。將它轉換爲一個數組數組對於Collection.toArray來說是微不足道的。

2

這是一個簡單但未經過徹底優化的示例。另外我不知道這將如何與多字節字符首先票價在變音等

public static void sortByFirstChar() { 
    String[] array = new String[4]; 
    array[0] = "apple"; 
    array[1] = "banana"; 
    array[2] = "mango"; 
    array[3] = "melon"; 

    HashMap<Character, ArrayList<String>> charToList = new HashMap<Character, ArrayList<String>>(); 

    for (String item : array) { 
     char firstChar = item.charAt(0); 
     if (charToList.containsKey(firstChar)) { 
      charToList.get(firstChar).add(item); 
     } else { 
      ArrayList<String> list = new ArrayList<String>(); 
      list.add(item); 
      charToList.put (firstChar, list); 
     } 
    } 

    Set<Character> keySet = charToList.keySet(); 
    for (char key : keySet) { 
     // Here are the arrays 
     System.out.println("Items for char " + new Character((char)key).toString() + ":"); 
     for (String item : charToList.get(key)) { 
      System.out.println (" " + item); 
     } 
    }  
} 

輸出示例:

Items for char b: 
    banana 
Items for char a: 
    apple 
Items for char m: 
    mango 
    melon 
+0

謝謝,雖然我沒有使用這個答案,這是非常好的,謝謝你的時間。 – 2011-02-06 19:54:17

1

這裏有一個未優化的解決方案。我測試了幾個不同的組合。輸出是數組列表。該功能的printList在打印的logcat中數組你可能想用自己的功能來替代它:


public class SortArray extends Activity { 
    ArrayList matchedFruits = new ArrayList(); 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     String fruits[] = new String[7];//Sorted array 
     fruits[0] = "apple"; 
     fruits[1] = "apricot"; 
     fruits[2] = "banana"; 
     fruits[3] = "mango"; 
     fruits[4] = "melon"; 
     fruits[5] = "pineapple"; 
     fruits[6] = "peach"; 
     char currChar=fruits[0].charAt(0);//Get first char of first element 

     boolean match=false; 
     int len=fruits.length; 
     List tmp = new ArrayList(); 

     for(int i=1;i < len;i++) 
     { 
      Log.d("Comparing ", fruits[i].charAt(0)+","+currChar); 
      if (fruits[i].charAt(0)==currChar) 
      { 
       if (match==false)//new match? 
       { 
        match=true;//Reset search 
        tmp.clear();//clear existing items 
        tmp.add(fruits[i-1]); 
        Log.d("Started new list ", fruits[i-1]); 
       } 
       else 
       { 
        tmp.add(fruits[i-1]); 
        Log.d("Added to list ", fruits[i-1]); 
       } 
      } 
      else 
      { 
       match=false; 
       tmp.add(fruits[i-1]); 
       matchedFruits.add(tmp.toArray(new String[tmp.size()]));//add to final list 
       Log.d("Finished a list ", fruits[i-1]); 
       tmp.clear();//clear existing items 

      } 
      currChar=fruits[i].charAt(0); 


     } 
     tmp.add(fruits[len-1]); 
     matchedFruits.add(tmp.toArray(new String[tmp.size()]));//add left over items 
     printList(); 
    } 

    void printList() 
    { 
     //Print the list 
     for(int i=0;i < matchedFruits.size();i++) 
     { 
      String tmp2[]= matchedFruits.get(i); 
      for (int j=0;j < tmp2.length;j++) 
      { 
       Log.d("Final list", "Array #"+i+"["+j+"],"+tmp2[j]); 
      } 
     } 
    } 
} 

+0

感謝萬萬:) – 2011-02-06 19:54:43