Сортировка массивов Android - PullRequest
1 голос
/ 06 февраля 2011

У меня есть массив, упорядоченный в алфавитном порядке;

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

Что мне нужно сделать сейчас, это разбить массив строк на меньшие строковые массивы с группами букв, так что вывод будет:

[0] = apple

[0] = banana

[0] = mango
[1] = melon

Я перепробовал несколько методов, но все они безнадежны. Можете ли вы дать мне кусок кода, который сделает это?Я обещаю поставить лучший ответ галочкой, а все хорошие ответы - точкой!

Ответы [ 4 ]

2 голосов
/ 06 февраля 2011

Вот простой, но не полностью оптимизированный пример. Также я не уверен, как это будет с многобайтовыми первыми символами, как в умлаутах и ​​т. Д.

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
2 голосов
/ 06 февраля 2011

Вот как бы я это сделал:

  1. создать отсортированную карту (например, TreeMap) с первым символом в качестве ключа и списком фруктов в качестве значения

  2. итерируйте исходный массив.

  3. на каждой итерации извлекайте первый символ и смотрите, содержит ли карта его в качестве ключа.Если нет, создайте пустой список фруктов и поместите его на карту.Поместите текущий фрукт в список (был ли он уже на карте или нет)

  4. Запросите значения карты: это упорядоченная коллекция списков фруктов.преобразование его в массив массивов тривиально с Collection.toArray.

1 голос
/ 06 февраля 2011

Вот неоптимизированное решение.Я проверил на несколько разных комбинаций.Результатом является список массивов.Функция 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]);
            }
        }
    }
}

1 голос
/ 06 февраля 2011

Вы определенно захотите использовать лучший способ хранения данных вместо массивов ... может быть, 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). В списках хорошо то, что их размер является динамическим (размеры массивов статичны).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...