发生事件(条件)时在java中动态创建对象

时间:2015-03-17 14:40:22

标签: java

再次提出一个问题,我仍然从你们所有人那里学到了很多东西,但现在我又需要一些建议。首先,我将描述我想要做的事情。我的目标是创建一个区域并用点填充它。此外,我想在小区域中划分区域,并为新区域分配正确的点。只有在事件发生时才应执行拆分,例如,如果该区域中的点数超过特定数量k。到目前为止,我有以下课程

public class Koord {

private int number;
private static int numberOfNodes = 0;
private int x;
private int y;

public Koord(int x, int y) {
    this.x = x;
    this.y = y;
    this.number = ++numberOfNodes;
}

public int getX() {
    return x;
}

public int getY() {
    return y;
}

public int getNumber() {
    return number;
}
}

Koord类用坐标和静态计数器表示点(因为我的点需要一些名字)。

import java.util.LinkedList;    

public class GeoArea {

private int[] area;

private LinkedList<Koord> areaContacts = new LinkedList<>();

/**
 * A empty GeoArea is created.
 */
public GeoArea() {
    area = new int[4];

}

/**
 * A GeoArea is created with the array of the parameters
 * 
 * @param x0
 * @param x1
 * @param y0
 * @param y1
 */
public GeoArea(int x0, int x1, int y0, int y1) {
    this.area = new int[4];
    this.area[0] = x0;
    this.area[1] = x1;
    this.area[2] = y0;
    this.area[3] = y1;

}

public void setArea(int x0, int x1, int y0, int y1) {
    area[0] = x0;
    area[1] = x1;
    area[2] = y0;
    area[3] = y1;
}

public int getX0() {
    return area[0];
}

public int getX1() {
    return area[1];
}

public int getY0() {
    return area[2];
}

public int getY1() {
    return area[3];
}

public LinkedList<Koord> getAreaContacts() {
    return areaContacts;
}

public void setAreaContacts(LinkedList<Koord> areaContacts) {
    this.areaContacts = areaContacts;
}

}

在GeoArea类中,我有区域的坐标和链表,我想保存属于该区域的点。

我的第三课是班级显示:

 import java.util.LinkedList;
 import java.util.Random;


 public class Display {
 public static void main(String args[]) {
     Random rand = new Random(); 


 GeoArea area1 = new GeoArea(0, 50, 0, 99);
 GeoArea area2 = new GeoArea(51, 99, 0, 99);

     LinkedList<Koord> ownArea = new LinkedList<Koord>();

      Koord point1 = new Koord(rand.nextInt(99), rand.nextInt(99));
      Koord point2 = new Koord(rand.nextInt(99), rand.nextInt(99));
      Koord point3 = new Koord(rand.nextInt(99), rand.nextInt(99));
      Koord point4 = new Koord(rand.nextInt(99), rand.nextInt(99));
      Koord point5 = new Koord(rand.nextInt(99), rand.nextInt(99));
      Koord point6 = new Koord(rand.nextInt(99), rand.nextInt(99));
      Koord point7 = new Koord(rand.nextInt(99), rand.nextInt(99));

      ownArea.add(point1);
      ownArea.add(point2);
      ownArea.add(point3);
      ownArea.add(point4);
      ownArea.add(point5);
      ownArea.add(point6);
      ownArea.add(point7);

      for(Koord c : ownArea) {
          if (area1.getX0() >= c.getX() || c.getX()< area1.getX1()) {
              area1.getAreaContacts().add(c);
            } else {
                area2.getAreaContacts().add(c);
            }
            System.out.println("x: " + c.getX() + " y: " + c.getY() +  " Element number" + c.getNumber());
      }

      for(Koord c : area1.getAreaContacts()) {

            System.out.println("Area 1  x: " + c.getX() + " y: " + c.getY() +  " Element number" + c.getNumber());
      }

      for(Koord c : area2.getAreaContacts()) {

            System.out.println("Area 2  x: " + c.getX() + " y: " + c.getY() +  " Element number" + c.getNumber());
      }


      System.out.println("List size:" + area1.getAreaContacts().size());
      System.out.println("List size:" + area2.getAreaContacts().size());
 }
}

正如你所看到的,我在这里用随机坐标创建一些点。之后我将它们添加到区域ownArea。之后,我将通过整个ownArea并将坐标与两个区域area1和area2的坐标进行比较。因此,现在我的目标是每次向其添加新点(Koord)时检查ownArea的大小,并且如果大小大于整数k,则在n(例如3)部分中拆分ownArea。对我来说最简单的方法是创建n个新区域并将ownArea中的元素复制到新区域。但是我想要做到这一点,所以如果我改变&#34; n&#34; (要分割的区域的数量)也改变新区域的数量。你能给我一些建议吗?我真的想学点东西,所以不要认为我需要完整的解决方案,提示和简单的例子也会有所帮助。最后 - 我不是很擅长英语,所以我的解释很简单,而且我的语法也不是最好的,所以请随意提出任何修改。非常感谢你。

1 个答案:

答案 0 :(得分:2)

一些建议:

由于您需要可变数量的区域,因此可以将区域放在集合中,以便可以添加更多区域,而不是将它们保留为实例变量。列表例如。如果您需要按名称查找区域,请使用地图。

然后,当您想要替换某个区域时,将其从集合中删除并添加替换区域。

通过仅将区域划分为一个维度(例如,在y轴上),将区域划分为n个子区域可能是最容易的。当你这样做时,小心处理除以n后的任何余数。