2015-04-16 106 views
0

我有2 ArrayList s。第一個保留第二個ArrayList中的元素應該如何排序的索引。如何使用ArrayList 1中的正確索引對ArrayList 2中的元素進行分組?Collections.sort with 2 array

我的代碼:

public void createRolette(Population population) throws Exception { 
    ArrayList<Integer> rouletteId = new ArrayList<Integer>(); 
    ArrayList<Integer> rouletteFit = new ArrayList<Integer>(); 
    for (int i=0; i<populationSize; i++) { 
     population.getIndividual(i); 
     Simulator.allocateTask(i); 
     rouletteId.add(i); 
     rouletteFit.add(calcFitness(i)); 
    } 
    // Collections.sort(rouletteFit); 

我的輸出:

[0,1,2,3,4,5,6,7,8,9,10,11,12, 13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32, 38,39,40,41,42,43,44,45,46,47,48,49] [90,86,86,86,86,86,86,86,86,86,86,86, 86,86,86,86,86,86,86,90,86,86,86,86,86,86,86,86,86,86,86,86,88,86,88,86,86, 86,86,86,86,86,86,86,86,86,86,86,86]

我正在嘗試使用此給定的解決方案,但代碼中存在一些我無法修復的錯誤。

public abstract class Roulette implements Comparable<Roulette>{ 

super(); //here says "Syntax error on token "super", Identifier expected" 
int rouletteId; 
int rouletteFit; 

public Roulette(int rouletteId, int rouletteFit){ 
    this.rouletteId = rouletteId; 
    this.rouletteFit = rouletteFit; 
} 

public int getId(){ 
    return rouletteId; 
} 

public int getFit(){ 
    return rouletteFit; 
} 

public static Comparator<Roulette> FitComparator = new Comparator<Roulette>() { 

public int compare(Roulette r1, Roulette r2) { 

    int fit1 = r1.getFit(); 
    int fit2 = r2.getFit(); 

    //ascending order 
    return fit1.compareTo(fit2); 

    //descending order 
    //return fit2.compareTo(fit1); 
} 

}; 



public void createRoulette(Population population) throws Exception { 
ArrayList<Roulette> rouletteList = new ArrayList<Roulette>(); 

for (int i=0; i<population.size(); i++){ 
    population.getIndividual(i); 
    Simulator.allocateTask(i); 
    Roulette r = new Roulette(i, Simulator.calcFitness(i)); // here in "new Roulette says // - Multiple markers at this line 
//- Cannot instantiate the type Roulette 
//- Line breakpoint:Roulette [line: 48] 

createRoulette(Population) 
    rouletteList.add(r); 
} 

    Collections.sort(rouletteList, Roulette.FitComparator); 
} 
} 
+2

您是否正在尋找某種[地圖](https://docs.oracle.com/javase/8/docs/api/java/util/Map.html)?因爲我不知道你在努力達到什麼目的。 – Veluria

+1

這是學習算法時的經典練習。 –

+0

@LuiggiMendoza,你可以用英文向我們翻譯OP的要求,甚至更好地編輯和改進問題,這樣的要求是明確的? –

回答

2

你也可以實現你自己的排序算法和交換兩個數組的值。以下使用Bubble Sort,一種簡單的排序算法。

public static void createRolette(Population population) throws Exception { 
    ArrayList<Integer> rouletteId = new ArrayList<Integer>(); 
    ArrayList<Integer> rouletteFit = new ArrayList<Integer>(); 
    int swap; 

    for (int i=0; i<populationSize; i++){ 
     population.getIndividual(i); 
     Simulator.allocateTask(i); 
     rouletteId.add(i); 
     rouletteFit.add(calcFitness(i)); 
    } 

    //Bubble Sort 
    for (int i = 0; i < (rouletteFit.size() - 1); i++) { 
     for (int j = 0; j < rouletteFit.size() - i - 1; j++) { 
      if (rouletteFit.get(j) > rouletteFit.get(j+1)) 
      { 
       swap  = rouletteFit.get(j); 
       rouletteFit.set(j, rouletteFit.get(j+1)); 
       rouletteFit.set(j+1, swap); 

       swap  = rouletteId.get(j); 
       rouletteId.set(j, rouletteId.get(j+1)); 
       rouletteId.set(j+1, swap); 
      } 
     } 
    } 
} 
+0

Bubblesort不是一個有效的算法。 –

+0

Bubblesort在最壞的情況下是O(n^2)的順序,但如果您的數組已排序或接近排序,則它非常有效。所以,我寧願說,如果你做出了很好的選擇,所有的算法都是有效的。無論如何,這只是一個例子。 – Aladdin

+0

哈哈,如果排序或接近排序,所有排序算法都非常有效*;)。 –

0

可以創建對象的ArrayList,一個ID和飛度,或者你可以讓你有兩個Arrays而不是兩個的ArrayList的邏輯。

public class Roulette implements Comparable<Roulette>{ 
    super(); 
    int rouletteId; 
    int rouletteFit; 

    public Roulette(int rouletteId, int rouletteFit){ 
     this.rouletteId = rouletteId; 
     this.rouletteFit = rouletteFit; 
    } 

    public int getId(){ 
     return rouletteId; 
    } 

    public int getFit(){ 
     return rouletteFit; 
    } 

    public static Comparator<Roulette> FitComparator 
         = new Comparator<Roulette>() { 

    public int compare(Roulette r1, Roulette r2) { 

     int fit1 = r1.getFit(); 
     int fit2 = r2.getFit() 

     //ascending order 
     return (fit1 - fit2); 

     //descending order 
     //return (fit2 -fit1); 
    } 

    }; 

} 

public void createRoulette(Population population) throws Exception { 
    ArrayList<Roulette> rouletteList = new ArrayList<Roulette>(); 

    for (int i=0; i<populationSize; i++){ 
     population.getIndividual(i); 
     Simulator.allocateTask(i); 
     Roulette r = new Roulette(i, calcFitness(i)); 
     rouletteList.add(r) 
    } 

    Collections.sort(rouletteList, Roulette.FitComparator); 
} 
+0

我想使用你的代碼彼得羅夫,但是給了很多錯誤。 – find83

0

根據您目前的實施的ArrayList的,你不能簡單地調用Collections.sort()到組飛度您數組列表和你的ID相同的映射。要實現這一點,你基本上有3種選擇:

  1. 創建自己的排序算法:您可以輕鬆地實現一個簡單的排序算法,將組rouletteFit的價值和重組也相應指標的rouletteId
  2. 執行實現Comparable<ClassName>的自定義Class。這將允許您創建一個同時包含id和fit的類,並允許您編寫自定義compareTo()方法,因此您可以簡單地使用Collections.Sort()
  3. 創建地圖:您可以使用HashMap類將擬合值存儲爲鍵,並使用該擬合的索引具有ArrayList。該定義看起來像HashMap<Integer, ArrayList<Integer>> map;