我试图从所有可能对象的数组生成新的唯一对象到另一个数组。我的想法是我有3个实现Region类的类,它们有自己的方法。这三个班级在我的ArrayList<Region> arr
中。我选择一个随机类,并在for循环中将其添加到ArrayList<Region> ALL_REGIONS
。问题是从arr
添加的对象不是唯一的,它们是相同的。这可以通过他们的名字告诉他们。每个地区都必须拥有它的唯一名称和其他设置,但它们不是。所以这是我到目前为止的代码:
public void generateRegions(){
ArrayList<Region> arr = Regions.getAllRegions();
Random rnd = new Random();
String ntype;
int regcounter = 5;
int b;
for(int i = 0; i < regcounter; i++){
ALL_REGIONS.add(arr.get(rnd.nextInt(arr.size())));
ntype = "n" + ALL_REGIONS.get(i).getType();
b = rnd.nextInt(Regions.getNtypeSize(ntype));
UI.print("b: " + b);
ALL_REGIONS.get(i).setName(Regions.getArrayName(ntype, b));
}
}
public static ArrayList<Region> getAllRegions(){
ArrayList<Region> arr = new ArrayList<Region>();
arr.add(new Highlands());
arr.add(new Cave());
arr.add(new Oasis());
return arr;
}
getArrayName
从数组中返回Region的String名称,getNtypeSize
返回一个int,数组String[]
的大小,它包含所有刚才不重要的名称。< / p>
那么..我怎样才能拥有每一个洞穴,每个绿洲都独一无二/作为一个独立的对象?
**编辑:**请求的getArrayName()和getNtypeSize()方法如下:
public static String getArrayName(String ntype, int t) {
String ans = null;
if(ntype.equals("ncave")){
if(t<=ncaveSize)
ans = ncave[t];
}else if(ntype.equals("noasis")){
if(t<=noasisSize)
ans = noasis[t];
}else if(ntype.equals("nhighlands")){
if(t<=noasisSize)
ans = nhighlands[t];
}
//Can happen when t is bigger then ntype size or
// if ntype string is wrong
if(ans == null){
UI.printerr("getArrayNames: ans is empty/null");
}
UI.printerr(ans);
return ans;
}
public static int getNtypeSize(String ntype){
int ans = 0;
if(ntype.equals("ncave")){
ans = ncaveSize;
}else if(ntype.equals("noasis")){
ans = noasisSize;
}else if(ntype.equals("nhighlands")){
ans = nhighlandsSize;
}else
UI.printerr("getNtypeSize: returned 0 as an error");
return ans;
}
答案 0 :(得分:1)
问题出在这一行:
ALL_REGIONS.add(arr.get(rnd.nextInt(arr.size())));
在这里,您没有向ALL_REGIONS添加新对象。相反,每次向“arr”中的对象添加引用时。
例如,每次rnd.nextInt(arr.size())
返回2时,您都会将arr[2]
的引用添加到ALL_REGIONS
。因此,有效地,ALL_REGIONS
中的每个条目都引用arr
中的一个对象。 (在此特定示例中,您在getAllRegions()
)
实际上,这意味着Highlands
中的每个ALL_REGIONS
对象引用都指向同一个对象=&gt; arr[0]
同样,Cave
中的每个ALL_REGIONS
引用都指向arr[1]
,每个Oasis
引用指向arr[2]
这一行的某些内容应该可以解决问题:
Region reg = arr.get(rnd.nextInt(arr.size()))
ALL_REGIONS.add(reg.clone()); // this is just meant to be a sort of pseudo-code. Use a clone() method to create a new copy of the object and that copy to ALL_REGIONS.
答案 1 :(得分:1)
如果我做对了吗?您想要回转到原始对象的类型。这很容易,您将使用一些Java多态概念。
您将使用名为InstanceOf
的函数,如此
Region ob = arr[0];
if (ob instanceof Highlands)
Highlands newOb = (Highlands) ob;