如何在main中的所有声明对象中只选择一次该数组中的随机元素?

我希望这些对象在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()); 

如果要在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 usedNames = new ArrayList(); 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"); } } 

将“剩余名称”保留在列表或集合中,当您需要选择一个时,将其从“剩余”中删除。

 public class NamePicker { protected List names = new ArrayList( Arrays.asList( "Terminator", "Slicer","Ninja", "cow", "Robot", "littlegirl" )); protected List 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()调用内部构造函数。

因为你选择了一个随机元素(int)(Math.random()* names.length)..而且由于概率,你是偶然地再次选择同一个元素

1个问题的选项可能是随机化名称数组并按顺序选择2.另一个选项是使用列表而不是数组并删除一次使用