2013-04-17 3 views
1

У меня есть ArrayList, который состоит из ArrayList, который состоит из строк: ArrayList<ArrayList<String>>. Как я могу сортировать первую запись его внутреннего массива ArrayList? Например, я хотел бы это:Сортировать по первой записи ArrayList в ArrayList

a = [['1','apple'],['3','pear'],['2','banana'],['1',orange']] 

стать:

a_sorted = [['1','apple'],['1','orange'],['2','banana'],['3','pear']] 

Порядок дублирующих первых записей (например, apple и orange) не имеет значения. Я пробовал использовать Collections.sort(a,new ColumnComparator()), но он не принимает ArrayLists. Это класс, я использовал:

public class ColumnComparator implements Comparator<ArrayList<String>>{ 
    public int compare(ArrayList<String> ar1, ArrayList<String> ar2){ 
     return ar1.get(0).compareTo(ar2.get(0)); 
    } 
} 
+0

'Collections.sort' должен принимать ArrayLists. Вы проходили в ArrayList или ArrayList ? –

+0

Какая ошибка вы получаете? – WilQu

+0

Сортировка, сортировка по естественному порядку элементов. На этих подмассивах нет естественного порядка. –

ответ

2

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

class Fruit implements Comparable<Fruit> { 
protected int number; 
protected String name; 

public Fruits(int number, String name) { 
    this.number = number; 
    this.name = name; 
} 

@Override 
public int compareTo(Fruit f) { 
    return number < f.number; 
    // or depending on if ascending or descending order wanted 
    // return number > f.number 
} 
} 

Тогда-то просто запустить Collections.sort(a). Этот способ является гибким и легко расширяется.

+0

Это кажется хорошей идеей, я попробую. – Tim

+0

В конце концов я пошел с этой идеей, потому что это действительно очень легко расширяемый. И это также дало мне идеи для решения других проблем. – Tim

2

Вы можете создать Map <String, ArrayList<String>> с первым вхождением ArrayLists как ключ и ArrayList сам в качестве значения. Затем сортируйте карту (используйте Sorted Map или Comparator для сортировки по клавишам Карты), и вы получите то, что хотите.

+0

У меня есть об этом, но строки, которые нужно сортировать, как вы могли видеть, не уникальны (хотя комбинация остальной части записей). Разве это не испортит карту? – Tim

+1

Вы правы. В этом случае используйте Map >, который решит проблему неисторических первых записей.Прежде чем вставлять пары ключ-значение в карту, проверьте, существует ли это значение, и если это произойдет ... просто добавьте ArrayList в список ArrayLists, уже сохраненный на карте. – Suchet

+0

Это может быть хорошей идеей. Я дам ему попробовать – Tim

0

Почему вы не используете этот ArrayList<Map<String,String>> вместо ArrayList<ArrayList<String>>. Вы можете легко отсортировать карту по ключу, используя TreeMap. Примечание. Это будет работать, только если у вас есть только две записи в вашем внутреннем arraylist.

+0

Это был всего лишь пример, мой внутренний ArrayList на самом деле намного больше. – Tim

+0

Еще что вы можете сделать, это заменить ваш внутренний ArrayList на карту >. Здесь первый элемент внутреннего Arraylist может использоваться в качестве ключа карты и отдыха как значения (список ). Используя TreeMap, вы сможете легко отсортировать элементы по первому значению. –

+0

Разве это не создает много накладных расходов? Так как я создам много карт таким образом. – Tim

0

Если вы действительно хотите сделать это таким образом, вы можете попробовать это:

import java.util.Comparator; 

public class ColumnComparable implements Comparator<ArrayList<String>>{ 

    @Override 
    public int compare(ArrayList<String> o1, ArrayList<String> o2) { 
     return (Integer.parseInt(o1.get(0)) > Integer.parseInt(o2.get(0)) ? -1 : (Integer.parseInt(o1.get(0)) == Integer.parseInt(o2.get(0)) ? 0 : 1)); 
    } 
} 

код был найден here.