2013-03-27 2 views
0

В ArrayList<ArrayList<Double>> selected хранится 5 записей. Каждая из этих записей задается двумя параметрами - rank и cd:Записи заказов в ArrayList

rank = [1.0, 2.0, 3.1, 1.2, 2.1] 
cd = [6.2, 5.2, 7.1, 8.0, 1.1] 

Мне нужно заказать эти записи, во-первых, по rank и вторых, по cd в порядке убывания (т.е. 3.1, 2.1 , 2.0, 1.2, 1.1). Второй порядок (по cd) должен применяться к записям, которые уже были заказаны rank.

ArrayList<Double> rank = new ArrayList<Double>(); 
ArrayList<Double> cd = new ArrayList<Double>(); 

ArrayList<ArrayList<Double>> selected = new ArrayList<ArrayList<Double>>(); 

for (int i=0; i<len; i++) { 
    rank.add(getRank(i)); 
    cd.add(getCub_len(i)); 
} 
selected.add(0,rank); 
selected.add(1,cd); 

Comparator<ArrayList<Double>> comparatorRank = new Comparator<ArrayList<Double>>() 
{ 
    public int compare(ArrayList<Double> a, ArrayList<Double> b) 
    { 
     return (int) (a.get(0) - b.get(0)); 
    } 
}; 

Comparator<ArrayList<Double>> comparatorCD = new Comparator<ArrayList<Double>>() 
{ 
    public int compare(ArrayList<Double> a, ArrayList<Double> b) 
    { 
     return (int) (a.get(1) - b.get(1)); 
    } 
}; 

Collections.sort(selected, comparatorRank); 
Collections.sort(selected, comparatorCD); 

Проблема в том, что я не знаю, как получить идентификаторы, которые были назначены для записей перед заказом. Например, это неупорядоченная последовательность идентификаторов: 1, 2, 3, 4, 5, и это последовательность идентификаторов после заказа: 5, 3, 4, 1, 2. Как получить эти идентификаторы?

+2

Похоже, вам нужен класс, который хранит ранг и код одного объекта, так что вы можете иметь список этого объекта. Затем вы просто определяете свой compareTo этого класса, чтобы использовать ранг в качестве поля для сортировки. –

+0

@Kevin Crowell: Не могли бы вы привести пример? Благодарю. –

+0

Проверьте принятый ответ на этот вопрос: http://stackoverflow.com/questions/3718383/java-class-implements-comparable –

ответ

0

Это, как я хотел бы подойти к нему ...

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.Collections; 
import java.util.List; 

public class SortPairs { 

    public static void main(String[] args) { 
     List<Double> rank = new ArrayList<Double>(Arrays.asList(1.0, 2.0, 3.1, 1.2, 2.1)); 
     List<Double> cd = new ArrayList<Double>(Arrays.asList(6.2, 5.2, 7.1, 8.0, 1.1)); 

     List<Pair<Double, Double>> pairs = new ArrayList<Pair<Double, Double>>(rank.size()); 
     for (int i = 0; i < rank.size(); ++i) 
      pairs.add(new Pair<Double, Double>(rank.get(i), cd.get(i))); 

     Collections.sort(pairs); 

     ListIterator<Double> rankIter = rank.listIterator(); 
     ListIterator<Double> cdIter = cd.listIterator(); 
     for (Pair<Double, Double> pair : pairs) { 
      System.out.println(String.format("[rank = %.1f, cd = %.1f", pair.getT1(), pair.getT2())); 
      rankIter.next(); 
      cdIter.next(); 
      rankIter.set(pair.getT1()); 
      cdIter.set(pair.getT2()); 
     } 
    } 

    public static class Pair <T1 extends Comparable<? super T1>, T2 extends Comparable<? super T2>> implements Comparable<Pair<T1, T2>> { 
     private final T1 t1; 
     private final T2 t2; 

     public Pair(T1 t1, T2 t2) { 
     this.t1 = t1; 
     this.t2 = t2; 
     } 

     public T1 getT1() { 
      return t1; 
     } 

     public T2 getT2() { 
      return t2; 
     } 

     @Override 
     public int compareTo(Pair<T1, T2> other) { 
      return t1.equals(other.t1) ? 
       other.t2.compareTo(t2) : 
       other.t1.compareTo(t1); 
     } 
    } 
} 
Смежные вопросы