Java数组填充了最后一个插槽中的内容

时间:2015-01-27 03:50:55

标签: java arrays for-loop

所以我使用这个for循环从一个更大的数组中用5个随机的东西填充一个小数组但我有一个问题,当我用这个新对象填充原始数组时,它填充它上面的每个插槽刚刚放入的对象。所以我的小数组中的所有内容都是一样的。

`public Prize[] Showcase(){

        Scanner fileIn=null;
        try{
            fileIn = new Scanner(new File("prizeList.txt"));    
            for(int i=0;fileIn.hasNextLine();i++){
                String delim ="\t";
                String[] splitStrings=fileIn.nextLine().split(delim);
                if(splitStrings.length==2){
                    int thing = Integer.parseInt(splitStrings[1]);
                    prizeList[i]=new Prize(splitStrings[0],thing);


                }

            }
        }
        catch(Exception e){
            System.out.println(e);              
        }
        return prizeList;

    }
    public static void Prizes(Prize[] prizeList){
        for(int i=0;i<5;i++){
        Random bkRandy=new Random();
        int randy = bkRandy.nextInt(50);
        prizes[i]=prizeList[i];
        System.out.println(prizes[i].getName());
        }
    }`

我不知道发生了什么,我从未见过它做过这样的事情。我没有得到任何错误或任何东西,我怀疑这个循环有问题。

我的问题是&#34;为什么用最后一个对象填充每个插槽?&#34;

public class Prize {
    private static String name;
    private static int price;
    public Prize( String name, int price){
        this.name = name;
        this.price = price;
    }
    public static int getPrice() {
        return price;
    }
    public void setPrice(int price) {
        this.price = price;
    }
    public static String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }   
}

2 个答案:

答案 0 :(得分:2)

当你制作static时,只有一个。因此,您的实例是共享相同数据的唯一引用。你需要像

这样的东西
public class Prize {
    private String name;  // <-- not static.
    private int price;  // <-- not static.
    public Prize(String name, int price){
        this.name = name;
        this.price = price;
    }
    public int getPrice() {  // <-- not static.
        return price;
    }
    public void setPrice(int price) {
        this.price = price;
    }
    public String getName() { // <-- not static.
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }   
}

使用Prize代码,您只能获得“last”值,因为每个实例都共享了类级字段(static)。

答案 1 :(得分:0)

如果我正确理解您的问题,您就会问如何从其他列表中获取随机项列表。我假设你特别不想要重复(即短名单不应包含更长列表中的多个项目)。如果这是正确的,那么我建议如下:

List<Prize> getRandomPrizes(List<Prize> prizes, int prizeCount) {
    Collections.shuffle(prizes);
    return prizes.stream().limit(prizeCount).collect(Collectors.toList());
}

自动处理原始列表中奖励少于prizeCount的情况。