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

Java array filled with what is in the last slot

所以我使用这个 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());
        }
    }`

我不确定发生了什么,我从来没有见过它做这样的事情。我没有收到任何错误或任何我怀疑循环有问题的东西。

我的问题是"why is it filling every slot with the last object?"

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

如果我对你的问题的理解正确,你是在问如何从另一个列表中获取随机项目的列表。我假设您特别不想要重复项(即短列表不应包含较长列表中的一项以上)。如果那是正确的,那么我建议如下:

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

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

当你做某事时 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" 值,因为每个实例共享 class 级别字段 (static)。