为什么我不能将值从一个 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
同时考虑显示的方法 ,这可能会更快。
我正在使用 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
同时考虑显示的方法