[英]Collections.sort with 2 array
我有2个ArrayList
。 第一个在第二个ArrayList
保留元素排序的索引。 如何使用ArrayList
1中的适当索引对ArrayList
2中的元素进行分组?
我的代码:
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,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,86,90,86,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, 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);
}
}
}
}
您可以创建具有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);
}
使用ArrayLists的当前实现,您不能简单地调用Collections.sort()
将Fit的数组列表和ID的映射相同进行分组。 要实现此目的,您基本上有3个选择:
rouletteFit
的值进行分组,并在rouletteId
重新组织相应的索引。 Comparable<ClassName>
的自定义Class
。 这将允许您构建一个包含id和Fit in一个对象的类,并允许您编写自定义的compareTo()
方法,因此您可以简单地使用Collections.Sort()
。 HashMap
类将拟合值存储为键,并具有使用该拟合的索引ArrayList
。 该定义看起来像HashMap<Integer, ArrayList<Integer>> map;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.