繁体   English   中英

无法获得可比的接口

[英]Can't get Comparable Interface Working

我正在开发线性Evol.Algrm。 我正在为我的基因组实现“可比”,以简化评估。 这是课程:

public class Chromosome extends Thread implements Comparable
{
    private String[] chromosome;
private double fitness;
private Random chromoGen;


public Chromosome(double[] candidate)
{        
    super();
    //encode candidate PER parameter; using Matrix as storage
    chromosome = encode(candidate);
}
//De-fault
public Chromosome()
{
    super();
}


public int compareTo(Chromosome c)
{
    return (fitness - c.fitness);
}

/**
 * Fitness stored in chromosome!
 */
public void setFitness()
{
    fitness = FF.fitness(this);
}

public double getFitness()
{
    return fitness;
}

/**
 * ENCODERS/DECODERS
 */
public String[] encode(double[] solution)
{
    //subtract 2^n from solution until you reach 2^-n

    /**
     * THE PRECISION IS [2^10 <-> 2^-8]!!!
     */
    double parameter = 0.00;
    String row = "";
    String[] encoded = new String[6];
    for (int j = 0; (j < 6); j++){
        parameter = solution[j];
        for (int i = 10; (i < (-8)); i--){
            if ((parameter - Math.pow(2, i)) >= 0){
                parameter = parameter - Math.pow(2, i);
                row += "1";
            }
            else{
                row += "0";
            }
        }
        encoded[j] = row;

        //refresh
        row = "";
    }

    return encoded;
}

public String encode(double sol)
{
    //subtract 2^n from solution until you reach 2^-n

    /**
     * THE PRECISION IS [2^10 <-> 2^-8]!!!
     */
    String row = "";

    for (int i = 10; (i < (-8)); i--){
        if ((sol - Math.pow(2, i)) >= 0){
            sol = sol - Math.pow(2, i);
            row += "1";
        }
        else{
            row += "0";
        }
    }

    return row;
}

public double decoded(int number)
{
    //returns UN-ENCODED solution
    double decoded = 0.00;
    String parameter = "";

    parameter = chromosome[number];
    for (int i = 10; (i < (-8)); i--){
        if (parameter.substring(i, (i+1)).equals("1")){
            decoded += Math.pow(2, i);
        }
    }

    return decoded;
}

/**
 * GETTERS
 * ---------------\/--REDUNDANT!!
 */
public double getParameter(int parameter)
{
    //decoded solution
    return decoded(parameter);
}

/**
 * Used in E-algrm.
 */
public String getRow(int row)
{
    //encoded solution
    return chromosome[row];
}

/**
 * SETTERS
 */
public void setRow(String encoded, int row)
{
    chromosome[row] = encoded;
}

public void setRow(double decoded, int row)
{
    chromosome[row] = encode(decoded);
}

/**
 * MUTATIONS IFF (mutate?)
 */
public void mutate(double mutationRate)
{
    //range of: 0-17
    int ran = 0;
    char[] temp;
    for (int m = 0; (m < 6); m++){
        temp = String.toCharArray(chromosome[m]);
        ran = chromoGen.nextDouble();
        if (ran <= mutationRate){
        }
    }
}
}

我的问题是,即使我清楚地实现了比较方法; 编译器仍然不满意,并说“必须声明抽象或实现等等等等……”

有什么帮助吗?

您需要使Comparable为通用接口,以便能够将Chromosome类型参数传递到compareTo中。 这应该implement Comparable<Chromosome> 否则compareTo方法必须为Object类型。

因此,如果这是您的班级签名:

public class Foo implements Comparable {

然后compareTo方法签名必须是:

public int compareTo(Object o) {

而且您必须在方法内部进行一些转换。 另一方面,如果您的班级签名是

public class Foo implements Comparable<Foo> {

然后compareTo方法签名必须是:

public int compareTo(Foo o) {

并且不需要铸造。

作为附带建议,您不想扩展Thread(尤其是在我看不到您实现public void run()方法的情况下),因为这将不必要地限制您的代码。 更好地实现Runnable,并在需要时将其传递给Thread对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM