【问题标题】:Changing data in List using ListIterator使用 ListIterator 更改 List 中的数据
【发布时间】:2014-06-06 10:19:02
【问题描述】:

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

database 的声明是private List<String[]> database = null;

MTdatabase 的声明是private List<String[]> MTdatabase = null;

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

我没有修改database 中的任何数据,但我不知道为什么database 的值会更改。 MTrans 在 for 循环中被修改,但由于我没有使用 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的初始值存起来,以后再用?

【问题讨论】:

    标签: java list iterator listiterator


    【解决方案1】:

    这段代码:

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

    【讨论】:

    • 意味着itrdb.next()返回一个指向对象而不是对象本身的指针(如c)?但在文档中,它显示在这种情况下它会返回String[]
    • String [] 是指向下一个结果的引用(指针),而不是下一个结果的副本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-12
    • 1970-01-01
    相关资源
    最近更新 更多