使用ListIterator更改List中的数据

时间:2014-06-06 10:19:02

标签: java list iterator listiterator

这是我用来从给定交易构建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的初始值并在以后使用它?

1 个答案:

答案 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到内存中的对象。