Java: синхронная сортировка нескольких списков ArrayList или одного сопоставленного ArrayList - PullRequest
1 голос
/ 02 июля 2010

Я только начал изучать Java около 3 месяцев назад, и это мой первый пост здесь, поэтому, пожалуйста, потерпите меня.

У меня есть несколько ArrayList, построенных из разобранного XML, которые по порядку напрямую связаны друг с другом. Позднее массивы помещаются в один сопоставленный ArrayList (groupData) для чтения с помощью SimpleAdapter, который создает список в графическом интерфейсе Android.

То, что я хочу сделать, это отсортировать список в алфавитном порядке на основе одного массива (arr_title), а остальные массивы останутся в синхронизированном с ним порядке. Неважно, где происходит сортировка, пока сортируется окончательный отображаемый список. Я ожидаю, что будет лучше отсортировать сопоставленный массив, как только он будет построен. Чем проще или легче понять код, тем лучше, но не нужно, чтобы сортировка шла слишком медленно. У меня есть около 140 объектов на массив, но это может расшириться, учитывая, что XML извлекается из Интернета.

Я часами искал в Google и пробовал некоторые вещи с небольшим прогрессом. Collections.sort (arr_title) будет сортировать один массив так, как я хочу, но затем другие массивы не совпадают и делают то же самое с другими массивами, очевидно, просто сортируют их по отдельности, как я не хочу. Я заметил упоминание об использовании типа TreeMap и Comparator для аналогичной сортировки, но не мог понять, как использовать их в этом случае, вероятно, потому что примеры не предоставили мне достаточно большой картины для понимания.

В приведенном ниже примере большинство вещей происходит после создания отдельных массивов.

List<Map<String, String>> groupData = new ArrayList<Map<String, String>>();
Map<String, String> group;

int item = 0;
do {
    group = new HashMap<String, String>();
    group.put("title", arr_title.get(item));
    group.put("desc", arr_desc.get(item));
    group.put("num", Integer.toString(arr_num.get(item)));
    groupData.add(group);
    item++;
} while (item < arr_num.size());

SimpleAdapter adapter = new SimpleAdapter(this, groupData, android.R.layout.simple_list_item_2, new String[] {"title", "desc", "num"}, new int[]{android.R.id.text1, android.R.id.text2});
setListAdapter(adapter);

Ответы [ 4 ]

5 голосов
/ 12 февраля 2011

Я склонен согласиться, использование компаратора было бы проще.
т.е.

    Comparator<HashMap<String, String>> comparator = new Comparator<HashMap<String, String>>() {                                    
        @Override
        public int compare(HashMap<String, String> object1, HashMap<String, String> object2) 
        {       
                return object1.get("title").compareToIgnoreCase(object2.get("title"));
        }
};      
Collections.sort(groupData, comparator);

'title' - ключ в хэше для сортировки.

1 голос
/ 02 июля 2010

Добро пожаловать на SO.

Прежде всего, существуют соглашения Java для именования переменных. Посмотрите Соглашения об именах

Во-вторых, Java - это объектно-ориентированный язык, поэтому вам нужно немного передумать о подходах к решению проблем.

В этом конкретном случае вы хотите, чтобы все данные, разбросанные по 3 массивам, были вместе. Ну, создайте для него класс.

public class Data implements Comparable{
 private String title;
 private String desc;
 private int num;
 public Data(String title, String desc, int num){
  //set the private fields here
}
//You may want to write some setters and getters here for individual fields.

public int compareTo(Object o){
//here you compare an item with other item. Remember to cast the object o to Data.
// Read http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Comparable.html to know what to return
}

}

А потом в вашем основном классе:

int item = 0;
do {
    Data group = new Data(arr_title.get(item),arr_desc.get(item),arr_num.get(item);
    groupData.add(group);
    item++;
} while (item < arr_num.size());
Collections.sort(groupData);

И последнее, но не менее важное: есть лучшие способы перебора набора в Java. Читайте о Итераторы . Это гораздо более безопасный и понятный способ прохождения массива или набора.

0 голосов
/ 25 сентября 2010

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

ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();
// Put separated item details in a HashMap for each item,
// then insert it in sorted order to list.
for(int n = 0; n < arrayTitle.size(); n++) {
    HashMap<String, String> item = new HashMap<String, String>();
    item.put("title", arrayTitle.get(n));
    item.put("desc", arrayDesc.get(n));     
    try {
        int c, i = 0;
        do {
            // Compare new title with titles existing in list 
            // from beginning to end or until title is found that it goes before.
            c = arrayTitle.get(n).compareTo(list.get(i).get("title"));
            i++;
        } while (c > 0 & i < list.size());
        i--;
        if(c > 0) {
            // New item goes after all others currently in list.
            list.add(item);
        } else if (c < 0) {
            // New item goes before an item already in list.
            list.add(i, item);
        }
    } catch (Exception e) {
        // If nothing in list to compare with, add first item.
        list.add(item);
    }
}       
SimpleAdapter adapter = new SimpleAdapter(this, list, android.R.layout.simple_list_item_2, new String[] {"title", "desc"}, new int[]{android.R.id.text1, android.R.id.text2});
setListAdapter(adapter);
0 голосов
/ 02 июля 2010

Мне кажется, что вы совершили классическую ошибку новичка (за которую вы можете быть прощены): недостаточно мыслите в терминах предметов.

Java - объектно-ориентированный язык. Мне кажется, что ваши множественные списки связанных элементов действительно должны быть одним списком объектов, каждый из которых содержит свой набор элементов, которые вы в настоящее время помещаете в несколько списков. Затем вы можете отсортировать этот список объектов с помощью компаратора любым удобным для вас способом. Все связанные атрибуты красиво инкапсулированы внутри своего объекта, к которому они принадлежат. Они остаются вместе независимо от того, как вы их сортируете.

Все объекты - это инкапсуляция и сокрытие информации.

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