我希望这些对象在main中声明的所有对象中只在数组中打印一次随机名称。我的问题是,它会显示两次或更多的名称。
public class Fighters {
private static String[] names = { "Terminator", "Slicer","Ninja", "cow", "Robot", "littlegirl" };
private static int id = 0;
public Fighters(){
id++;
name = names[(int) (Math.random() * names.length)];
}
public String toString(){
return String.format(id+" Name:%-5s, name);
}
}
在main()
我有这些对象
Fighters a1 = new Fighters();
System.out.println(a1.toString());
Fighters a2 = new Fighters();
System.out.println(a2.toString());
Fighters a3 = new Fighters();
System.out.println(a3.toString());
答案 0 :(得分:3)
如果要在Fighter类中保留名称分配,请使用静态变量来保存已使用名称的列表。您需要确保没有创建比名称数组更多的Fighters。否则这将无限循环。我会把它留给你来计算那一部分。这至少应该让你走上正轨。
import java.util.ArrayList;
public class Fighter {
private String name;
private static String[] names = { "Terminator", "Slicer","Ninja",
"cow", "Robot", "littlegirl" };
private static int id = 0;
private static ArrayList<String> usedNames = new ArrayList<String>();
public void Fighters(){
id++;
String checkedName = "";
do{
checkedName = names[(int) (Math.random() * names.length)];
if(!usedNames.contains(checkedName)) break;
}
while(true);
name = checkedName;
usedNames.add(name);
}
public String toString(){
return String.format(id+" Name:%-5s, name");
}
}
答案 1 :(得分:0)
将“剩余名称”保留在列表或集合中,当您需要选择其中一个时,请随意执行此操作。将其从“剩余”中移除。
public class NamePicker {
protected List<String> names = new ArrayList( Arrays.asList(
"Terminator", "Slicer","Ninja", "cow", "Robot", "littlegirl" ));
protected List<String> remaining = names;
public String pickName() {
if (remaining.isEmpty()) {
// could refill 'remaining' here.. but we'll just throw, for now.
throw new IllegalStateException("names all used");
}
int index = (int) (Math.random() * remaining.size());
String result = remaining.remove( index);
return result;
}
}
将这种行为放在一个类中也可以很好地包装它,并使您能够更好地分离“名称分配”以创建战士,例如。从文件或数据库加载它们。
通常,您不应该只设计一个假设您“创建”实体的构造函数 - 您应该允许“加载实体”。当你到达那里时,最好的方法是有两个静态方法,一个用于create()
,另一个用于load()
调用内部构造函数。
答案 2 :(得分:-1)
因为你选择一个随机元素(int)(Math.random()* names.length)..并且由于概率,你偶然再次选择同一个元素
1问题的选项可能是随机化名称数组并按顺序选择 2.另一种选择是使用列表而不是数组并删除一次使用