2015-04-16 71 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;