【问题标题】:Android array sortingAndroid数组排序
【发布时间】:2011-02-06 16:24:34
【问题描述】:

我有一个按字母顺序排列的数组;

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

我现在需要做的是,将字符串数组拆分为带有字母组的较小字符串数组,因此输出将是:

[0] = apple

[0] = banana

[0] = mango
[1] = melon

我尝试了几种方法,但都没有希望,你能给我一段代码来做到这一点吗?我保证给最好的答案打勾,所有好的答案都给一分!

【问题讨论】:

  • 您要实现的实际任务是什么?您可以通过一个简单的循环来实现这一点,但对于整个问题可能有更好的解决方案。

标签: java android arrays string


【解决方案1】:

我会这样做:

  1. 创建一个排序的地图(例如 TreeMap),其中第一个字符作为键,水果列表作为值

  2. 遍历原始数组。

  3. 在每次迭代中,提取第一个字符并查看映射是否包含它作为键。如果没有,请创建一个空的水果列表,并将其放入地图中。将当前的水果放入列表中(无论它是否已经在地图中)

  4. 询问地图的值:它是水果列表的有序集合。使用 Collection.toArray 将其转换为数组数组是微不足道的。

【讨论】:

    【解决方案2】:

    这是一个简单但未彻底优化的示例。此外,我不确定这将如何处理多字节首字符,如 Umlauts 等。

    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
    

    【讨论】:

    • 谢谢你,虽然我没有用这个答案,很好,谢谢你的时间。
    【解决方案3】:

    您肯定希望使用一种更好的方式来存储数据而不是数组...也许是 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)。列表的好处是它们的大小是动态的(数组维度是静态的)。

    【讨论】:

    • 非常感谢,太有帮助了!
    【解决方案4】:

    这是一个未经优化的解决方案。我测试了几个不同的组合。输出是数组列表。 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-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-18
      • 2018-07-11
      相关资源
      最近更新 更多