Collections.sort with 2 array



我有 2 个ArrayList。第一个保留了元素在第二个ArrayList中应如何排序的索引。如何使用 ArrayList 1 中的正确索引对元素进行分组ArrayList

我的代码:

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, 33, 34, 35, 36, 37, 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, 90, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 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);
}
}

您还可以实现自己的排序算法并从两个数组中交换值。以下使用气泡排序,一种简单的排序算法。

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);
            }
        }
    }
}
<</div> div class="one_answers">

您可以使用 ID 和 Fit 创建对象的数组列表,也可以保留两个数组而不是两个数组列表的逻辑。

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);
}

使用当前 ArrayList 的实现,您不能简单地调用 Collections.sort() 来对 Fit 的数组列表进行分组,并将映射到您的 id 相同。 要实现这一点,您基本上有 3 个选项:

  1. 创建自己的排序算法:您可以轻松实现一个简单的排序算法,该算法将对rouletteFit的值进行分组,并在rouletteId中重新组织相应的索引。
  2. 实现实现Comparable<ClassName>的自定义Class。 这将允许您在一个对象中构建一个同时包含 id 和 Fit 的类,并允许您编写自定义 compareTo() 方法,因此您可以简单地使用 Collections.Sort() .
  3. 创建 Map:您可以使用 HashMap 类将拟合值存储为键,并拥有使用该拟合的索引ArrayList。 该定义看起来像HashMap<Integer, ArrayList<Integer>> map;

最新更新