从数组到数组创建新对象

时间:2014-05-28 19:01:25

标签: java arrays object unique

我试图从所有可能对象的数组生成新的唯一对象到另一个数组。我的想法是我有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;
}

2 个答案:

答案 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()

中添加了3个对象之一

实际上,这意味着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;