该程序应该像这样工作:
首先它从用户获得SENTENCE(字符串)和MUTATION因子(double)。然后它将字符串SENTENCE更改为chars数组(ARRAY 1)。之后它会生成5个新的char数组,其长度等于ARRAY 1的长度。它们中的每一个都充满了随机字符(只有字母和空格)。然后程序选择与ARRAY 1最相似的5个中的一个。获胜者“乘以”到下面的5个数组中。在每个程序中,程序验证是否符合ARRAY 1.如果char适合ARRAY 1中的字符,则程序不会更改它。如果char不适合ARRAY 1中的char,则它会变异或不变(根据MUTATION因子和随机概率)。然后程序选择一个与ARRAY 1最相似的数组,获胜者“mulitplies”等。程序工作直到程序所生成的数组与ARRAY 1相同。'Counter'(static int)计算有数组的“代数”在程序制作正确的数组之前通过。
我怀疑最后一种方法可能有问题。但我真的不知道它是什么。这是我写的代码:
static int counter;
public static void main(String[] args) {
Scanner skaner = new Scanner(System.in);
String sentence = skaner.nextLine();
double mutation = Double.parseDouble(skaner.nextLine());
//
ArrayList<char[]> candidates = Draw(ChangeIntoChars(sentence), mutation);
char[] candidate = ChooseTheBestOne(candidates,
ChangeIntoChar(sentence));
String result = CheckAndDraw(candidate, ChangeIntoChars(sentence),
mutation);
System.out.print(result);
System.out.println();
System.out.print(counter);
}
public static char[] ChangeIntoChars (String sentence) {
char[] chars = sentence.toCharArray();
return chars;
}
public static ArrayList<char[]> Draw (char [] chars, double mutation) {
char [] random1 = new char [chars.length];
char [] random2 = new char [chars.length];
char [] random3 = new char [chars.length];
char [] random4 = new char [chars.length];
char [] random5 = new char [chars.length];
Random r = new Random();
for (int i=0; i<random1.length; i++) {
if (random1[i]==chars[i]) {}
else {double p = Math.random();
if (mutation>p){
String alphabet = "aąbcćdeęfghijklłmnńoópqrsśtuwxyzżź ";
random1[i]=(alphabet.charAt(r.nextInt(alphabet.length())));
}
else {}
}}
for (int i=0; i<random2.length; i++) {
if (random2[i]==chars[i]) {}
else {double p = Math.random();
if (mutation>p){
String alphabet = "aąbcćdeęfghijklłmnńoópqrsśtuwxyzżź ";
random2[i]=(alphabet.charAt(r.nextInt(alphabet.length())));
}
else {}
}}
for (int i=0; i<random3.length; i++) {
if (random3[i]==chars[i]) {}
else {double p = Math.random();
if (mutation>p){
String alphabet = "aąbcćdeęfghijklłmnńoópqrsśtuwxyzżź ";
random3[i]=(alphabet.charAt(r.nextInt(alphabet.length())));
}
else {}
}}
for (int i=0; i<random4.length; i++) {
if (random4[i]==chars[i]) {}
else {double p = Math.random();
if (mutation>p){
String alphabet = "aąbcćdeęfghijklłmnńoópqrsśtuwxyzżź ";
random4[i]=(alphabet.charAt(r.nextInt(alphabet.length())));
}
else {}
}}
for (int i=0; i<random5.length; i++) {
if (random5[i]==chars[i]) {}
else {double p = Math.random();
if (mutation>p){
String alphabet = "aąbcćdeęfghijklłmnńoópqrsśtuwxyzżź ";
random5[i]=(alphabet.charAt(r.nextInt(alphabet.length())));
}
else {}
}}
ArrayList<char[]> candidates = new ArrayList<char[]>();
candidates.add(random1);
candidates.add(random2);
candidates.add(random3);
candidates.add(random4);
candidates.add(random5);
return candidates;
}
public static char [] ChooseTheBestOne(ArrayList<char[]>candidates,char[]chars) {
char [] number1 = candidates.get(0);
char [] number2 = candidates.get(1);
char [] number3 = candidates.get(2);
char [] number4 = candidates.get(3);
char [] number5 = candidates.get(4);
int j = 0;
for (int i=0; i<number1.length; i++){
if (number1[i]==chars[i]){
j++;}
}
int k = 0;
for (int i=0; i<number2.length; i++){
if (number2[i]==chars[i]){
k++;}
}
int l = 0;
for (int i=0; i<number3.length; i++){
if (number3[i]==chars[i]){
l++;}
}
int m = 0;
for (int i=0; i<number4.length; i++){
if (number4[i]==chars[i]){
m++;}
}
int n = 0;
for (int i=0; i<number5.length; i++){
if (number5[i]==chars[i]){
n++;}
}
int [] whosTheWinner = {j,k,l,m,n};
int max = 0;
char[] winner = null;
for (int x=0; x<whosTheWinner.length; x++) {
if (whosTheWinner[x]> max) {max = whosTheWinner[x];
if (x==0) {winner = number1;}
else if (x==1) {winner = number2;}
else if (x==2) {winner = number3;}
else if (x==3) {winner = number4;}
else if (x==4) {winner = number5;}
}}
counter++;
return winner ;
}
public static String CheckAndDraw (char[]winner,char[]chars,double mutation){
int i = 0;
String end = "This is not what I meant.";
boolean success;
if (winner[i]==chars[i]){
success = true;
end = "END";
}
else {success = false;}
while (success!=true){
ArrayList<char[]> resultsOfTheDraw = Draw(winner, mutation);
winner = ChooseTheBestOne(resultsOfTheDraw, chars);
}
return end;
}
}
答案 0 :(得分:1)
您的问题是,在方法ChooseTheBestOne()
中,在方法结尾的if-else梯形图中,有时没有条件为真,因此winner
保持为空。您需要在该梯形图中添加else
子句,以便为winner
分配内容。