这是我用来从给定交易构建Megatransactions的函数。 (数据挖掘)
database
声明为private List<String[]> database = null;
MTdatabase
声明为private List<String[]> MTdatabase = null;
在调用此函数之前,database
包含所有必需数据,MTdatabase
最初为空。
我从database
获取数据,对其进行修改,然后将其存储在MTdatabase
。
我没有修改database
中的任何数据,但我不知道为什么database
的值会发生变化。
在for循环中修改了MTrans
,但由于我没有使用itrdb.set()
,因此不应在database
中修改任何数据。
我不想修改database
。
我尝试将MTrans
的初始值存储在ntrans
中,以保持database
的数据相同,但ntrans
每次更改MTrans
时都会更改。
ntrans
的代码显示为评论。
private void BuildMegaTransactions(List<String> frequent1) {
MTdatabase = new ArrayList<String[]>();
String[] MTrans;
//String[] ntrans;
int count=0;
ListIterator<String []> itrdb=database.listIterator();
while(itrdb.hasNext())
{
MTrans=itrdb.next();
//ntrans=Mtrans;
int len=MTrans.length;
for(int i=0;i<len;i++)
{
if(Frequent(MTrans[i],frequent1))
MTrans[i]=MTrans[i].concat(String.valueOf(count));
else
{
MTrans=removeElements(MTrans,MTrans[i]);
len=MTrans.length;
i=i-1;
}
}
//itrdb.set(ntrans);
MTdatabase.add(MTrans);
count++;
}
}
代码有什么问题吗?
如果我不想修改database
,我该怎么办?
有没有办法存储MTrans
的初始值并在以后使用它?
答案 0 :(得分:0)
此代码:
MTrans=itrdb.next();
将MTrans
指定为itrdb
中下一行的引用。这意味着当你运行你的行
if(Frequent(MTrans[i],frequent1))
MTrans[i]=MTrans[i].concat(String.valueOf(count));
else
{
MTrans=removeElements(MTrans,MTrans[i]);
len=MTrans.length;
i=i-1;
}
您正在修改database
中的数据。为避免修改原件,您应该更改
MTrans=itrdb.next();
到
String [] nextRow = itrdb.next();
MTrans=Arrays.copyOf(nextRow, nextRow.length);
这将在itrdb中创建行的深层副本,然后您可以在不影响原始行的情况下进行修改。
这里要学习的关键是,虽然Java名义上是通过价值;对于对象,传递的值是reference
到内存中的对象。