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
)。
所以我使用这个 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
)。