java - 静态方法更改用作参数的变量的值
问题描述
我在 PredictionUtil 类中创建了一个静态方法,用于从较小的列表生成新列表。新的更新列表不仅被分配给新变量,还被分配给较小的列表。我无法理解这个问题。
实用程序类:
public class PredictionUtils {
public static List<PeriodEntity> predictPeriods(List<PeriodEntity> past){
List<PeriodEntity> updated = past;
if(past == null){
return null;
}
int pastsize = past.size();
long currentcycledur = generateCurrentCycleDuration(past);
long currentperioddur = generateCurrentPeriodDuration(past);
long laststartdate = past.get(pastsize-1).getStartTimestamp();
for(int i = 1;i <= 20;i++){
updated.add(new PeriodEntity(laststartdate+(currentcycledur*i),laststartdate+(currentcycledur*i)+currentperioddur));
}
return updated;
}
public static long generateCurrentCycleDuration(List<PeriodEntity> past){
long cycleduration = 0L;
long diff;
int pastsize = past.size();
if(pastsize == 1){
return cycleduration = 2419200000L;
}
if(pastsize < 5) {
for (int i = 0; i < pastsize - 1; i++) {
diff = past.get(i + 1).getStartTimestamp() - past.get(i).getStartTimestamp();
cycleduration += diff;
}
return (cycleduration/(pastsize-1));
}else{
for (int i = pastsize-1;i >= pastsize-4;i--) {
diff = past.get(i).getStartTimestamp() - past.get(i-1).getStartTimestamp();
cycleduration += diff;
}
return (cycleduration/4);
}
}
public static long generateCurrentPeriodDuration(List<PeriodEntity> past){
long periodduration = 0L;
long diff;
int pastsize = past.size();
if(pastsize < 4){
for(int i = 0;i < pastsize;i++){
diff = past.get(i).getEndTimestamp()-past.get(i).getStartTimestamp();
periodduration += diff;
}
return (periodduration/pastsize);
}else{
for(int i = pastsize-1;i >= pastsize-4;i--){
diff = past.get(i).getEndTimestamp()-past.get(i).getStartTimestamp();
periodduration += diff;
}
return (periodduration/4);
}
}
}
它的用途:
//Observable LiveData Elements
calendarViewModel.getPastPeriods().observe(getViewLifecycleOwner(), new Observer<List<PeriodEntity>>() {
@Override
public void onChanged(final List<PeriodEntity> pastperiods) {
nextPeriod = PredictionUtils.predictPeriods(pastperiods).get(pastperiods.size());
}
});
lastperiods 和 nextPeriod 的值是一样的,为什么?
解决方案
您指的是输入,而不是创建 List 的新实例。
List<PeriodEntity> updated = past;
因此,两者updated
和past
列表基本上是相同的列表。因此,每当您进行修改时updated
,它也会更新past
.
为避免这种情况,请创建一个新ArrayList
的 forupdated
并复制past
那里的现有数据。
List<PeriodEntity> updated = new ArrayList<>(past);
推荐阅读
- amazon-elastic-beanstalk - 长时间运行的 Beanstalk 工作者作业和部署
- php - 在表格中显示结果时如何突出显示大文本中的某些单词?
- c++ - C++ 向量矩阵段错误:(
- git - git merge 正在根据合并策略更改文件
- r - 根据 R 中某个因子的存在来定义列表?
- sqlite - 如何在 SQL 中获取一行和三列(使用每个信使的成本总和)?
- c++ - 隐式对的模板参数推导
- python - 使用两个数据框的元素相乘创建新的数据框
- html - Bootstrap Navbar 中的“data-toggle="collapse" 按钮”有什么用?
- javascript - 如何在 HTML2PDF 中指定动态页脚和页眉