对健身函数数组进行排序

时间:2014-07-29 04:10:00

标签: java arrays sorting

我正在使用遗传算法来进化某些东西,我有一个双数组,如下所示。

fitness[0] = 15.0
fitness[1] = 12.0 
fitness[2] = 13.0
fitness[3] = 17.0 
fitness[4] = 8.0
fitness[5] = 18.0 

数组索引表示人口,其值为适合度功能。 我可以通过使用排序算法轻松地对数组进行排序,或者可以使用类似下面的内容 -

Integer[] arr =
    { 12, 67, 1, 34, 9, 78, 6, 31 };
    Arrays.sort(arr, new Comparator<Integer>()
    {
        @Override
        public int compare(Integer x, Integer y)
        {
            return x - y;
        }
    });

    System.out.println("low to high:" + Arrays.toString(arr));

但我想知道排序后的索引,如下所示: -

fitness[5] = 18.0 
fitness[3] = 17.0  
fitness[0] = 15.0
fitness[2] = 13.0
fitness[1] = 12.0 
fitness[4] = 8.0

基本上我想要输出像5,3,0,2,1,4。这意味着第五人比第三人好......

我写了一个包含太多if-else的代码,还有一些对我有用的代码。但代码看起来很丑陋而且令人困惑。 如果我尝试将数据/副本加载到HASH SET,但可以重复RHS上的值。

对于我来说,有比使用批次的if-else语句更好的方法吗?

2 个答案:

答案 0 :(得分:1)

解决此问题的一种常见方法是对排列数组进行排序,如下所示:

final Integer[] arr =
{ 12, 67, 1, 34, 9, 78, 6, 31 };
final Integer[] perm = new Integer[arr.length];
for (int i = 0 ; i != perm.length ; i++) {
    perm[i] = i;
}
Arrays.sort(perm, new Comparator<Integer>()
{
    @Override
    public int compare(Integer x, Integer y)
    {
        return arr[x] - arr[y];
    }
});

System.out.println("low to high:" + Arrays.toString(perm));

Demo on ideone.

答案 1 :(得分:0)

final double[] fitnessArray = new double [6];


        fitnessArray[0] = 15.0;
        fitnessArray[1] = 12.0;
        fitnessArray[2] = 13.0;
        fitnessArray[3] = 17.0;
        fitnessArray[4] = 8.0;
        fitnessArray[5] = 18.0;

        //Find the Fittest Attack BOT

        Double[] perm = new Double[fitnessArray.length];
        for (int i = 0 ; i != perm.length ; i++) {
            perm[i] = (double) i;
        }
        Arrays.sort(perm, new Comparator<Double>()
                {
            @Override
            public int compare(Double o1, Double o2) {
                // TODO Auto-generated method stub
                return (int) (fitnessArray[o1.intValue()] - fitnessArray[o1.intValue()]); // Higher value first
            }
                });

        System.out.println("low to high:" + Arrays.toString(perm));