2013-04-17 7 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']] 

중복 첫 번째 항목의 순서 (같은 appleorange)는 중요하지 않습니다. 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'는 ArrayList를 받아 들여야합니다. 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

가 먼저 키와 ArrayLists의 항목과 값으로 ArrayList에 자체에 Map <String, ArrayList<String>>를 만들 수 있습니다 : 이것은 내가 사용하는 클래스입니다. 그런 다음 키를 정렬 (Sorted Map 또는 Comparator을 사용하여 맵 키 정렬)하면 원하는 것을 얻을 수 있습니다.

+0

나는 이것에 대해 가지고 있지만 정렬해야 할 문자열은 볼 수 있듯이 고유하지 않습니다 (나머지 항목의 조합도 있음). 지도를 망칠까요? – Tim

+1

정확합니다. 이 경우 Map >을 사용하면 고유하지 않은 첫 번째 항목의 문제를 해결할 수 있습니다.키 - 값 쌍을 맵에 삽입하기 전에 값이 존재하는지 확인하고, 존재한다면 맵에 이미 저장된 ArrayList 목록에 ArrayList를 추가하십시오. – Suchet

+0

이것은 실제로 좋은 아이디어 일 수 있습니다. 나는 그것을 시도해 보겠다. – Tim

0

ArrayList<ArrayList<String>> 대신 ArrayList<Map<String,String>>을 사용할 수없는 이유는 무엇입니까? TreeMap을 사용하여 키의 Map을 쉽게 정렬 할 수 있습니다. 참고 : 내부 arraylist에 두 개의 항목 만있는 경우에만 작동합니다.

+0

이것은 단지 예일 뿐이며, 내 내부 ArrayList는 실제로 훨씬 더 큽니다. – Tim

+0

여전히 할 수있는 일은 내부 ArrayList를 Map >으로 대체하는 것입니다. 여기서 내부 Arraylist의 첫 번째 요소는지도의 키로 사용되며 값 (List )으로 사용할 수 있습니다. 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을 발견했다.

관련 문제