我正在使用一个arrayList,我正在通过循环从数据库中添加条目。在该循环中,我使用我正在阅读的行中的字段填充数组。我将此数组分配给arrayList。
我今天从Google上了解到,当我调用arrayList.add()时,我正在传递对数组的引用,而不是将数组复制到arrayList元素中。这不是我想要的。
有什么更好的方法来解决这个问题?
Cursor cursor = this.managedQuery(Record.Records.CONTENT_URI, projection, Record.Records.START_TIME + " > " + 1, null, Record.Records.START_TIME + " ASC");
int i, n, x = 0;
List<String[]> sleepCollection = new ArrayList<String[]>();
String[] sleepItem = new String[7];
for (i=0;i<cursor.getCount();i++)
{
if (i==0)
cursor.moveToFirst();
for (n=0;n<5;n++)
sleepItem[n] = cursor.getString(n);
// hours, duration
sleepItem[5] = String.valueOf((((Long.valueOf(sleepItem[1])-Long.valueOf(sleepItem[0]))/1000)+(Long.valueOf(sleepItem[4])*60))/60/60);
// minutes, duration
sleepItem[6] = String.valueOf((((Long.valueOf(sleepItem[1])-Long.valueOf(sleepItem[0]))/1000)+(Long.valueOf(sleepItem[4])*60))/60%60);
if ( (x > 0) &&
(Long.valueOf(sleepCollection.get(x-1)[1]) - Long.valueOf(sleepItem[0]) <= 7200000) // record started within 2 hours if end of previous record
)
{
// set rating
sleepCollection.get(x-1)[2] = String.valueOf((Float.valueOf(sleepCollection.get(x-1)[2])) + Float.valueOf(sleepItem[2]) / 2);
sleepCollection.get(x-1)[1] = sleepItem[1]; // set previous record's end date equal to current record's end date
// then add duration of previous record to current record (hours, then minutes)
sleepCollection.get(x-1)[5] = String.valueOf(Integer.valueOf(sleepItem[5])+Integer.valueOf(sleepCollection.get(x-1)[5]));
sleepCollection.get(x-1)[6] = String.valueOf(Integer.valueOf(sleepItem[6])+Integer.valueOf(sleepCollection.get(x-1)[6]));
// check if minutes are 60 or over
if (Integer.valueOf(sleepCollection.get(x-1)[6]) >= 60)
{
// if so, subtract 60 from minutes
sleepCollection.get(x-1)[6] = String.valueOf(Integer.valueOf(sleepCollection.get(x-1)[6]) - 60);
// and add an hour to hours
sleepCollection.get(x-1)[5] = String.valueOf(Integer.valueOf(sleepCollection.get(x-1)[5]+1));
}
}
else
{
// this passes a reference of sleepItem. I want sleepCollection to actually contain the array and not a reference to it. What's the best way to do that?
sleepCollection.add(sleepItem);
x++;
}
答案 0 :(得分:3)
这似乎是你问题的要点
// This passes a reference of sleepItem. I want sleepCollection to
// actually contain the array and not a reference to it. What's
// the best way to do that?
你所问的不是(从字面上看)有意义的。在Java中,没有必要说你想要包含一个数组而不是一个数组的引用。就语言而言,数组和引用基本上是相同的。
(从代表性的角度来看,ArrayList
中的“东西”总是会引用一个数组。该列表使用一个支持数组,它是一个引用数组。它不是以某种方式内化你“添加”的参数数组。)
实际上,我认为你真正要求的是如何让列表中的每个元素成为不同数组的引用。答案是在每个数组迭代上分配一个新数组。或者你可以这样做:
sleepCollection.add(sleepItem.clone());
答案 1 :(得分:1)
String[] sleepItem = new String[7];
必须将移动到循环内部,否则你的arraylist的条目将包含相同的行数据; - )。