0

这是我用来从给定交易构建大型交易的功能。(数据挖掘)

声明databaseprivate List<String[]> database = null;

声明MTdatabaseprivate List<String[]> MTdatabase = null;

在调用此函数之前database具有所有必需的数据并且MTdatabase最初是空的。我从中获取数据database,对其进行修改,然后将其存储在MTdatabase.

我没有修改 中的任何数据database,但我不知道为什么值database会改变。 MTrans在 for 循环中进行了修改,但由于我没有使用itrdb.set(),因此不应在database. 我不想修改database。我试图存储 in 的初始值MTransntrans保持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并在以后使用它?

4

1 回答 1

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

于 2014-06-06T10:28:20.790 回答