2

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

3 回答 3

3

如果您想在 Fighter 类中保留名称分配,请使用静态变量来保存已使用名称的列表。您需要确保您创建的 Fighters 没有超过 names 数组。否则这将无限循环。我会留给你来计算那部分。这至少应该让你走上正确的轨道。

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");
    }

}
于 2013-10-01T21:01:27.930 回答
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()调用内部构造函数。

于 2013-10-01T20:48:31.530 回答
-1

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

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

于 2013-10-01T20:48:37.650 回答