我是Java的新手并且有一个问题。这是家庭作业,所以我不想要任何直接的答案。谢谢!
我正在研究一种用于玩扑克的遗传算法。我想创建一个字符串数组的arrayList。字符串数组将在一轮中保持每个可能的手的移动。我现在要做的是确保它正常工作是运行我的方法并打印出结果。这是我的练习课(这只是作业的一小部分):::
import java.util.ArrayList;
import java.util.Arrays;
public class Play
{
GeneticAlg start;
ArrayList<Object> pop;
public static void main(String[] args)
{
GeneticAlg start = new GeneticAlg();
ArrayList<String[]> pop = start.initializePopulation();
for(String[] arr: pop)
{
System.out.println(Arrays.toString(arr));
}
}
}
import java.util.ArrayList;
import java.util.Random;
public class GeneticAlg
{
ArrayList<String[]> population;
int[] populationScores;
String[] chromosome;
int generation;
int index;
public GeneticAlg()
{
}
public ArrayList<String[]> initializePopulation()
{
ArrayList<String[]> population = new ArrayList<String[]>();
for (int i = 0; i < 20; i++)
{
Random generator = new Random();
String[] choices = {"bet","raise","call","check"};
chromosome = new String[33];
for (int j = 0; j < 33; j++)
{
if (j < 6) //first and second round possible hands)
{
index = generator.nextInt((choices.length)-1);
chromosome[j] += choices[index];
}
else //third, fourth, and fifth round possible hands)
{
index = generator.nextInt(choices.length);
chromosome[j] += choices[index];
}
}
population.add(chromosome);
}
return population;
}
}
现在,它正在打印出数组,但每个条目都是这样的:
[nullcall, nullraise, nullbet, nullraise, nullcall, nullraise,....
我希望它只返回前面没有null的移动。任何建议表示赞赏。谢谢!
ETA:我用连接错误修复了两行,但它仍然在每个命令前打印“null”。有什么建议吗?
修复错误后的代码:
import java.util.ArrayList;
import java.util.Arrays;
public class Play
{
GeneticAlg start;
ArrayList<Object> pop;
public static void main(String[] args)
{
GeneticAlg start = new GeneticAlg();
ArrayList<String[]> pop = start.initializePopulation();
for(String[] arr: pop)
{
System.out.println(Arrays.toString(arr));
}
}
}
import java.util.ArrayList;
import java.util.Random;
public class GeneticAlg
{
ArrayList<Object> population;
String[] choices;
int[] populationScores;
String[] chromosome;
int generation;
int index;
public GeneticAlg()
{
}
public ArrayList<Object> initializePopulation()
{
population = new ArrayList<Object>();
for (int i = 0; i < 20; i++)
{
Random generator = new Random();
for (int j = 0; j < 24; j++)
{
if (j < 6) //first and second round possible hands)
{
choices[0]= "bet";
choices[1]= "raise";
choices[3]= "call";
index = generator.nextInt(choices.length);
chromosome[j] = choices[index];
}
else //third, fourth, and fifth round possible hands)
{
choices[4] = "check";
index = generator.nextInt(choices.length);
chromosome[j] = choices[index];
}
}
population.add(chromosome);
}
return population;
}
}
答案 0 :(得分:4)
对象的数组(如Stirng
s)在开头用null
值填充,所以这样做
chromosome[j] += choices[index];
与
相同chromosome[j] = chromosome[j] + choices[index];
与
相同chromosome[j] = null + choices[index];
因此,您将null
与choices[index];
联系在一起,例如nullbet
。
要解决此问题,只需使用=
代替+=
。
答案 1 :(得分:2)
由于您不想要一个彻头彻尾的答案,请查看填充String []的代码。您的打印正在做正确的事情,但数组中的字符串实际上是&#34; nullbet,&#34; &#34; nullraise,&#34;等
答案 2 :(得分:1)
错误来自此行:
chromosome[j] += choices[index];
+ =运算符与字符串一起使用时,会将右侧字符串连接到左侧字符串的末尾。在这种情况下,它决定了染色体[j]的现有内容的选择[索引],如果将染色体声明为对象数组,它将默认为空。
你可能意味着
chromosome[j] = choices[index];
并且意外地插入了+,因为您在下面的列表中使用了population.add()。
答案 3 :(得分:1)
您的“修复”代码看起来好像无法编译 - 您可能仍在运行以前的版本。你没有初始化选择(“choices = new String [4]”)并且你混淆了它的索引(0,1,3和4)。此外,如果您稍后尝试向阵列添加第四个元素,请不要,您不能使用数组。并且您在没有强制转换的情况下将ArrayList分配给ArrayList。您只需要在原始代码中交换+ = with =,否则它似乎没问题。