无法获得可比较的接口工作
Can't get Comparable Interface Working
我正在开发线性 Evol.Algrm。我正在为我的基因组实施 'Comparable' 以简化评估;这是 class:
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){
}
}
}
}
我的问题是,尽管我清楚地实施了比较方法;编译器仍然不高兴并说 'Must declare abstract or implement blah blah blah...'
有什么帮助吗?
您需要使您的 Comparable 成为通用接口,以便能够将 Chromosome 类型参数传递给 compareTo。这个应该implement Comparable<Chromosome>
。否则 compareTo 方法必须是 Object 类型。
如果这是你的 class 签名:
public class Foo implements Comparable {
那么 compareTo 方法签名必须是:
public int compareTo(Object o) {
而且您必须在方法内部进行一些转换。另一方面,如果您的 class 签名是
public class Foo implements Comparable<Foo> {
那么 compareTo 方法签名必须是:
public int compareTo(Foo o) {
并且不需要转换。
作为附带建议,您不想扩展 Thread(尤其是当我没有看到您实现 public void run()
方法时),因为这会不必要地限制您的代码。最好实现 Runnable,并在需要时将其传递给 Thread 对象。
我正在开发线性 Evol.Algrm。我正在为我的基因组实施 'Comparable' 以简化评估;这是 class:
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){
}
}
}
}
我的问题是,尽管我清楚地实施了比较方法;编译器仍然不高兴并说 'Must declare abstract or implement blah blah blah...'
有什么帮助吗?
您需要使您的 Comparable 成为通用接口,以便能够将 Chromosome 类型参数传递给 compareTo。这个应该implement Comparable<Chromosome>
。否则 compareTo 方法必须是 Object 类型。
如果这是你的 class 签名:
public class Foo implements Comparable {
那么 compareTo 方法签名必须是:
public int compareTo(Object o) {
而且您必须在方法内部进行一些转换。另一方面,如果您的 class 签名是
public class Foo implements Comparable<Foo> {
那么 compareTo 方法签名必须是:
public int compareTo(Foo o) {
并且不需要转换。
作为附带建议,您不想扩展 Thread(尤其是当我没有看到您实现 public void run()
方法时),因为这会不必要地限制您的代码。最好实现 Runnable,并在需要时将其传递给 Thread 对象。