需要java arraylist帮助吗

需要java arraylist帮助吗,java,Java,以前使用过多种语言编写代码,但对Java来说是新手。 我想创建一个数组,其成员类型为 public class data { String date=""; String time=""; double price=0; int volume=0; }; data data1 = new data(); public ArrayList ftsedata = new ArrayList<da

以前使用过多种语言编写代码,但对Java来说是新手。 我想创建一个数组,其成员类型为

public class data
    {
        String date="";
        String time="";
        double  price=0;
        int volume=0;
    };

    data data1 = new data();
    public ArrayList ftsedata = new ArrayList<data>();
然后,我等待新的数据,当我得到它时,我再次将其插入数据1,并将其添加到ftsedata。尽管ftsedata的大小似乎在正确增加,但ftsedata的元素似乎只是指向数据1的指针,因此ftsedata的所有元素的值似乎都等于最后的数据1值

我使用arraylist是因为我不知道一天中会有多少数据点,所以我需要一些扩展的东西

有人能告诉我我是否应该使用arraylist或其他什么吗?如果arraylist,我的问题是什么

非常感谢您抽出时间


非常感谢大家,

我实际上有四个不同的函数,每个函数填充数据1的一部分。考虑到您的观点,我将data1单独作为一个变量,它可以在所有函数中看到。在将data1添加到arraylist的特定函数中,我创建了一个Data类型的dataLocal变量,并将所有内容复制到其中,如下所示 dataLocal.price=data1.price; 等等 然后我将dataLocal添加到arraylist中。这似乎奏效了。
我假设每次调用此函数时,都会创建一个名为dataLocal的新局部变量。谢谢你们所有人的帮助,请让我知道,如果在这种方式下有什么事情会让我以后陷入麻烦,例如,程序的某些其他部分会写入dataLocal的一个实例,因为就程序而言,对变量的需求已经结束。

在将对象放入ArrayList之前,请尝试克隆对象:

ftsedata.add(data1.clone());
是的,
ArrayList
(由其接口
列表
引用)看起来就是本例中所需的数据结构

通过将
公共类数据
设置为不可变值类型,可以最好地解决元素引用同一对象的问题。然后,每当您获得新数据时,您都会实例化一个新的
data
对象,您可以将其放入列表中

另见
  • 有效Java第二版,第52项:通过对象接口引用对象
  • 有效Java第二版,第15项:最小化可变性

您需要了解,对于非原语变量,它们都是“引用”(只需将其视为C/C++指针)

ArrayList正在存储对数据的“引用”列表(请使用数据而不是Java中类名的数据)


因此,您需要做的不是重用data1指向的数据实例,而是实例化一个新的数据实例,将新的传入数据放入该新实例,然后将该新实例添加到ftsedata。

放入ArrayList的实际上是引用,而不是对象的副本。因此,如果你这样做:

data data1 = new data();
data1.price = 50;
ArrayList ftsedata = new ArrayList<data>();
ftsedata.add(data1);
data1.price = 500;
data data1=新数据();
data1.price=50;
ArrayList ftsedata=新的ArrayList();
ftsedata.add(数据1);
data1.price=500;
由于data 1和FRA.get(0)都指向同一个对象,因此价格在data 1和ArrayList中都会发生变化。您需要做的是为要保留在ArrayList中的每个新版本创建一个新的数据对象,并确保不修改其中已有的版本

ArrayList ftsedata = new ArrayList<data>();
data data1 = new data();
//set values for properties of data1 here from wherever you are getting them
data1.price = 50;
...
ftsedata.add(data1);

data data2 = new data();
//set values for properties of data2 here from wherever you are getting them
data2.price = 500;
...
ftsedata.add(data2);
ArrayList ftsedata=new ArrayList();
data data1=新数据();
//在此处设置data1属性的值,无论从何处获取它们
data1.price=50;
...
ftsedata.add(数据1);
data data2=新数据();
//在此处为data2的属性设置值,无论从何处获取它们
数据2.2价格=500;
...
ftsedata.add(数据2);

这样,ArrayList中的每个条目都会有所不同。

ArrayList是正确的解决方案,但您只需要调整如何使用它。添加一个函数来为每次插入创建一个本地对象将有助于您的情况。见下文。我稍微修改了你的代码。我刚在记事本上写了这个,所以我为任何错误道歉。希望所展示的技术能有所帮助

public class Data
{
    String date="";
    String time="";
    double  price=0;
    int volume=0;
};
public class DataModel
{
   ArrayList<Data> ftsedata;
   public DataModel()
   {
      ftsedata = new ArrayList<Data>();
   }
   public void addDataPoint()
   {
       Data dp = new Data();
       dp.price = 50;
       dp.volume = 10;
       ...
       ftsedata.add(dp);
   }
}

// In your main control part of the application or wherever    
DataModel ftseDataModel = new DataModel();
while(something) // Maybe while you read a file? Check the server every so often
{
   ftseDataModel.addDataPoint();
}
公共类数据
{
字符串日期=”;
字符串时间=”;
双倍价格=0;
int体积=0;
};
公共类数据模型
{
ArrayList ftsedata;
公共数据模型()
{
ftsedata=新阵列列表();
}
public void addDataPoint()
{
数据dp=新数据();
dp.price=50;
dp.体积=10;
...
ftsedata.add(dp);
}
}
//在应用程序的主控制部分或任何地方
DataModel ftseDataModel=新数据模型();
while(某物)//也许是在你读文件的时候?经常检查服务器
{
ftseDataModel.addDataPoint();
}

Java编码惯例是使用大写的第一个字母作为类名()。虽然这可以解决问题,但这是一个糟糕的解决方案,因为它取决于对象是否可克隆。最好是在填充数据之前创建一个新的
Data
对象,它适用于所有类型的类,即使它们不可克隆。
public class Data
{
    String date="";
    String time="";
    double  price=0;
    int volume=0;
};
public class DataModel
{
   ArrayList<Data> ftsedata;
   public DataModel()
   {
      ftsedata = new ArrayList<Data>();
   }
   public void addDataPoint()
   {
       Data dp = new Data();
       dp.price = 50;
       dp.volume = 10;
       ...
       ftsedata.add(dp);
   }
}

// In your main control part of the application or wherever    
DataModel ftseDataModel = new DataModel();
while(something) // Maybe while you read a file? Check the server every so often
{
   ftseDataModel.addDataPoint();
}