我有一個按字母順序排列的數組;Android陣列排序
[0] = apple
[1] = banana
[2] = mango
[2] = melon
我現在需要做的是什麼,是字符串數組分割成帶有字母的羣體較小的字符串數組,所以輸出會是:
[0] = apple
[0] = banana
[0] = mango
[1] = melon
我已經嘗試了一些方法,但他們都是無望的,你能給我一段代碼來做到這一點嗎?我保證給出最好的答案和所有好答案一個點!
我有一個按字母順序排列的數組;Android陣列排序
[0] = apple
[1] = banana
[2] = mango
[2] = melon
我現在需要做的是什麼,是字符串數組分割成帶有字母的羣體較小的字符串數組,所以輸出會是:
[0] = apple
[0] = banana
[0] = mango
[1] = melon
我已經嘗試了一些方法,但他們都是無望的,你能給我一段代碼來做到這一點嗎?我保證給出最好的答案和所有好答案一個點!
你肯定會想用更好的方式來存儲數據,而不是數組...也許一個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
)。有關列表的好處是它們的大小是動態的(數組維度是靜態的)。
非常感謝,非常有幫助! – 2011-02-06 19:53:16
這是我會怎麼做:
創建有序映射(例如一個TreeMap)與第一個字符爲重點,和值水果的清單
迭代通過原陣列。
在每次迭代中,提取第一炭和看到,如果圖包含它作爲一個密鑰。如果沒有,請創建一個空的水果列表,並將其放置在地圖中。把目前的水果在列表中(無論是已經在地圖與否)
詢問地圖的價值:它是水果名單的有序集合。將它轉換爲一個數組數組對於Collection.toArray來說是微不足道的。
這是一個簡單但未經過徹底優化的示例。另外我不知道這將如何與多字節字符首先票價在變音等
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
謝謝,雖然我沒有使用這個答案,這是非常好的,謝謝你的時間。 – 2011-02-06 19:54:17
這裏有一個未優化的解決方案。我測試了幾個不同的組合。輸出是數組列表。該功能的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]);
}
}
}
}
感謝萬萬:) – 2011-02-06 19:54:43
什麼是你正在努力實現的實際任務?你可以用一個簡單的循環來實現這一點,但是對於整體問題可能有更好的解決方案。 – Dori 2011-02-06 16:39:09