我正在使用csv文件构建基本数据库,我正在测试select函数,当我遇到一些奇怪的东西时.
private ArrayList<Record> selectField(String selectTerm)
{
Log.log("Selection " + selectTerm,2,"DB_io");
ArrayList<Record> ret = new ArrayList<Record>();
if (titleRow.values.contains(selectTerm))
{
Log.log("Adding values to " + selectTerm);
int ordinal = titleRow.values.indexOf(selectTerm);
Log.log("Ordinal " + ordinal);
List<String> tempList = new ArrayList<String>();
for (Record r : data)
{
List<String> tempList = new ArrayList<String>();
tempList.add(r.values.get(ordinal));
Record s = new Record(tempList);
ret.add(s);
tempList.clear();
}
Log.log("Number of records in ret " + ret.size());
for (Record t : ret)
{
Log.log(t.toString());
}
}
else
{
Log.log("keyField does not contain that field");
return null;
}
Log.log("Values " + ret.toString());
return ret;
}
Run Code Online (Sandbox Code Playgroud)
当我这样做时,它记录的部分t.ToString()显示记录为空,而如果我在tempList.clear()之前记录它,它显示记录包含它应该的数据.
如果我将tempList声明移动到Record r:data循环中,那么它工作正常并且Record t:ret循环工作输出记录的内容就像它应该
为什么是这样?
编辑:记录课程
public class Record
{
List<String> values = new ArrayList<String>();
public Record(List<String> terms)
{
this.values = terms;
}
public Record(String[] s)
{
this.values = Arrays.asList(s);
}
public String toString()
{
return values.toString();
}
}
Run Code Online (Sandbox Code Playgroud)
您的Record实例包含对ArrayList传递给其构造函数的实例的引用.因此,当您打电话tempList.clear(),您清除相同List,你的Record实例抱着一个参考.
你不应该打电话tempList.clear(),因为ArrayList无论如何你在循环的每次迭代中创建一个新的.