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

时间:2013-10-01 20:43:17

标签: java arrays string assert

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

3 个答案:

答案 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.另一种选择是使用列表而不是数组并删除一次使用