代码之家  ›  专栏  ›  技术社区  ›  pie154

将元素添加到数组中,它替换了Java中的所有元素(重复)

  •  -1
  • pie154  · 技术社区  · 16 年前

    我正在向arraylist添加元素,并且它正确地添加了第一个元素,但是当我添加任何后续元素时,它将用最近添加的值替换其他元素,并向arraylist添加一个新元素。

    我使用arraylist和int甚至另一个创建的类运行了test,它工作得很好,但是我在这里使用的自定义类会导致一些问题。

    数组列表的代码是

    public static void main(String args[]){
       List<BasicEvent> list = new ArrayList<BasicEvent>();
       list.add(new BasicEvent("Basic", "Door", 9, 4444, new Date(12,04,2010), new Time(12,04,21), 1, 0.98, 0));
       list.add(new BasicEvent("Composite", "Door", 125, 4444, new Date(12,04,2010), new Time(12,04,20), 1, 0.98, 1));
       list.add(new BasicEvent("Basic", "Door", 105, 88, new Date(12,04,2010), new Time(12,05,23), 1, 0.98, 0));
       list.add(new BasicEvent("Basic", "Door", 125, 12, new Date(12,04,2010), new Time(12,05,28), 1, 0.98, 1));
       list.add(new BasicEvent("Basic", "Door", 129, 25, new Date(12,04,2010), new Time(12,05,30), 1, 0.98, 0));
       list.add(new BasicEvent("Basic", "Door", 125, 63, new Date(12,04,2010), new Time(12,04,20), 1, 0.98, 1));
       list.add(new BasicEvent("Basic", "Detect", 127, 9, new Date(12,04,2010), new Time(12,05,29), 1, 0.98, -1));
    
       for(int i=0;i<list.size();i++) {System.out.println("list a poition " + i + " is " + BasicEvent.basicToString(list.get(i)));}
    

    自定义类basicEvent的代码是

    public class BasicEvent {
      public static String Level;
      public static String EType;
      public static double xPos;
      public static double yPos;
      public static Date date;
      public static Time time;
      public static double Rlb;
      public static double Sig;
      public static int Reserved;
    
      public  BasicEvent(String L, String E, double X, double Y, Date D, Time T, double R, double S, int Res){
       Level = L;
       EType = E;
       xPos = X;
       yPos = Y;
       date = D;
       time = T;
       Rlb = R;
       Sig = S;
       Reserved = Res;
      };
    
     public static String basicToString(BasicEvent bse){
       String out = bse.getLevel() + ";" + bse.getEtype() + ";" + bse.getxPos() + ";" + bse.getyPos() + ";" + bse.getDate().dateAsString() + ";" + bse.getTime().timeAsString() + ";" + bse.getRlb() + ";" + bse.getSig() + ";" + bse.getReserved();
       return out;
      }
    
    3 回复  |  直到 13 年前
        1
  •  14
  •   Péter Török    16 年前

    你们班所有的同学 BasicEvent 是静态的,即它们在类的所有实例之间共享。因此,当您创建新实例时,旧实例的属性将被新值覆盖。

    您应该将类定义更改为

    public class BasicEvent {
      public String Level;
      public String EType;
      public double xPos;
      public double yPos;
      public Date date;
      public Time time;
      public double Rlb;
      public double Sig;
      public int Reserved;
      ...
    }
    

    顺便说一句,一般来说,使用公共字段不是一个好的做法——最好将它们设置为私有字段,并且只在需要时提供公共访问器/设置器。当然,在实验代码中这并不重要,但在生产质量代码中却很重要。

        2
  •  1
  •   Alexander Malfait    16 年前

    为什么你班上所有的同学都是静态的?

    静态意味着整个vm中只有一个值,所以逻辑上每个实例创建时都会覆盖这些值(这不是arraylist的问题)。

    将成员变量设为非静态变量,并考虑将它们设为私有变量并使用getter公开它们。

        3
  •  0
  •   Cyrille Ka    16 年前

    好吧,basicEvent中的所有字段都是静态的,所以它们属于类,而不是对象。这意味着它们对于所有对象都是相同的。每次创建对象时,都会在这些字段上进行写入。

    请查看Java文档中静态字段的含义以及如何使用它们。