存储意外值的 ArrayList 对象
ArrayList objects storing unexpected values
我有一个classDailyDetails.java
DailyDetails.java:
public class DailyDetails implements Serializable {
Calendar calendar;
int volume;
int target;
}
我有一个 ArrayList(名为 tempDD
)。
List<DailyDetails> tempDD = new ArrayList<>();
我想使用后续日历值将对象添加到此 arrayList(请参阅代码)。
lastAppOpenedDate
和 now
是日历 class 的两个实例。
下面是在我的 MainActivity 中将对象添加到 arrayList 的代码。
MainActivity.java
while(lastAppOpenedDate.get(Calendar.MINUTE) != now.get(Calendar.MINUTE)) {
DailyDetails dailyDetails = new DailyDetails();
dailyDetails.volume = waterConsumed;
preferences =
PreferenceManager.getDefaultSharedPreferences(this);
if(preferences.getBoolean("default_target",true)) {
dailyDetails.target =
preferences.getInt("defaultTargetValue",4000);
}
else {
dailyDetails.target =
preferences.getInt("customTargetValue",4000);
}
dailyDetails.calendar = lastAppOpenedDate; // Adding the calendar value
tempDD.add(dailyDetails); //Adding object to ArrayList.
if(tempDD.size() > 30 || tempDD.get(0).calendar == tempDD.get(1).calendar) { // Can be ignored right now.
tempDD.remove(0);
}
lastAppOpenedDate.add(Calendar.MINUTE, 1); // Adding one MINUTE to lastAppOpenedDate
waterConsumed = 0;
}
dailyDetails.calendar是关注点
预期结果:每次循环运行时,lastAppOpenedDate 日历值增加一分钟。所以,
假设 arrayList tempDD 中的第一个对象的分钟值为 5,那么下一个对象的分钟值应为 6,7,8,9,10,11 等等。
但在实际输出中,arrayList的每个对象中日历中的分钟值是相同的。 IE。
我在上面的代码之后添加了这段代码:
String s = "";
for(int i = 0; i < tempDD.size();i++){
s = s + tempDD.get(i).calendar.get(Calendar.MINUTE) + ",";
}
Log.d("Tag A","String: "+s);
这将在日志中打印 12,12,12,12,12,12,12....。
如有任何帮助,我们将不胜感激。 :)
您确实在循环的每次迭代中实例化了一个新的 DailyDetails
对象。但是您始终为其 .calender
属性分配 lastAppOpenedDate
的引用 - 而不是副本。
所以你会得到一个列表,其中包含十几个 DailyDetails
,所有这些都引用存储在 lastAppOpenedDate
中的相同实例。每次您在 for-i 循环中访问它时,该实例自然会具有相同的值,您已经更新了大约十几次。
将dailyDetails.calendar = lastAppOpenedDate;
改为
dailyDetails.calendar=lastAppOpenedDate.clone();
我有一个classDailyDetails.java
DailyDetails.java:
public class DailyDetails implements Serializable {
Calendar calendar;
int volume;
int target;
}
我有一个 ArrayList(名为 tempDD
)。
List<DailyDetails> tempDD = new ArrayList<>();
我想使用后续日历值将对象添加到此 arrayList(请参阅代码)。
lastAppOpenedDate
和 now
是日历 class 的两个实例。
下面是在我的 MainActivity 中将对象添加到 arrayList 的代码。
MainActivity.java
while(lastAppOpenedDate.get(Calendar.MINUTE) != now.get(Calendar.MINUTE)) {
DailyDetails dailyDetails = new DailyDetails();
dailyDetails.volume = waterConsumed;
preferences =
PreferenceManager.getDefaultSharedPreferences(this);
if(preferences.getBoolean("default_target",true)) {
dailyDetails.target =
preferences.getInt("defaultTargetValue",4000);
}
else {
dailyDetails.target =
preferences.getInt("customTargetValue",4000);
}
dailyDetails.calendar = lastAppOpenedDate; // Adding the calendar value
tempDD.add(dailyDetails); //Adding object to ArrayList.
if(tempDD.size() > 30 || tempDD.get(0).calendar == tempDD.get(1).calendar) { // Can be ignored right now.
tempDD.remove(0);
}
lastAppOpenedDate.add(Calendar.MINUTE, 1); // Adding one MINUTE to lastAppOpenedDate
waterConsumed = 0;
}
dailyDetails.calendar是关注点
预期结果:每次循环运行时,lastAppOpenedDate 日历值增加一分钟。所以, 假设 arrayList tempDD 中的第一个对象的分钟值为 5,那么下一个对象的分钟值应为 6,7,8,9,10,11 等等。
但在实际输出中,arrayList的每个对象中日历中的分钟值是相同的。 IE。 我在上面的代码之后添加了这段代码:
String s = "";
for(int i = 0; i < tempDD.size();i++){
s = s + tempDD.get(i).calendar.get(Calendar.MINUTE) + ",";
}
Log.d("Tag A","String: "+s);
这将在日志中打印 12,12,12,12,12,12,12....。
如有任何帮助,我们将不胜感激。 :)
您确实在循环的每次迭代中实例化了一个新的 DailyDetails
对象。但是您始终为其 .calender
属性分配 lastAppOpenedDate
的引用 - 而不是副本。
所以你会得到一个列表,其中包含十几个 DailyDetails
,所有这些都引用存储在 lastAppOpenedDate
中的相同实例。每次您在 for-i 循环中访问它时,该实例自然会具有相同的值,您已经更新了大约十几次。
将dailyDetails.calendar = lastAppOpenedDate;
改为
dailyDetails.calendar=lastAppOpenedDate.clone();