为什么我不能将值从一个 XYSeriesCollection 复制到另一个?

Why can't I copy a value from one XYSeriesCollection to other?

我正在使用 JFreeChart 在 java swing 中创建图像直方图。为了创建它,我遍历所有像素以获得所有颜色。根据大小和位深度,需要一些时间。

获得所有数据后,我将其放入 XYSeriesCollection 变量中。为了能够在后面显示和隐藏一些系列,我保存了该变量的副本。

我的问题是,如果我这样做:

final XYSeriesCollection data = createHistogram();
final XYSeriesCollection dataCopy = createHistogram();

它没有任何问题,但效率不高,因为我必须遍历所有像素,这需要一段时间。

如果我这样复制:

final XYSeriesCollection data = createHistogram();
final XYSeriesCollection dataCopy = data;

当我执行代码时出现异常:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Series index out of bounds
at org.jfree.data.xy.XYSeriesCollection.getSeries(XYSeriesCollection.java:263)

我认为这是因为当我从数据中删除系列时,它们也会从 dataCopy 中删除,但它们不应该完全不同吗?我只是使用这种方法:

data.removeAllseries();
data.addSeries(dataCopy.getSeries(index));

例如,如果我创建:

int x = 5;
int y = x;
x=0;
System.out.println(y)

输出应该仍然是 5,我对 x 做了什么并不重要。我在做什么或假设那是错误的?

谢谢。

注意shallow versus deep copy. Your example, dataCopy = data, makes a shallow copy. Use the dataset's clone() method to make a deep复制的区别:

XYSeriesCollection dataCopy = (XYSeriesCollection) data.clone();

您可以看到 clone() 是如何实现的 here。下面的片段创建了一个系列,克隆它,并更新原始片段以说明效果。

代码:

XYSeriesCollection data = new XYSeriesCollection();
XYSeries series = new XYSeries("Test");
data.addSeries(series);
series.add(1, 42);
System.out.println(data.getSeries(0).getY(0));
XYSeriesCollection dataCopy = (XYSeriesCollection) data.clone();
series.updateByIndex(0, 21.0);
System.out.println(data.getSeries(0).getY(0));
System.out.println(dataCopy.getSeries(0).getY(0));

控制台:

42.0
21.0
42.0

同时考虑显示的方法 ,这可能会更快。