通过Java中的迭代器进行对象赋值

时间:2012-03-28 22:47:06

标签: java

我有一段这样的代码:

HashSet<Object> Set = new HashSet<Object>();
//add elements to set 'Set'
Object o = null;
for (Iterator<Object> itr=Set.iterator();itr.hasNext();) {
    o = itr.next();
    //doing some processing on o
}

我假设Object o将指向itr指向的Object。但它没有按预期工作。 itr.next()指向的属性不会被复制到o。 任何人都可以建议我哪里出错了?还有一些关于对象分配的有用帖子,如

o1 = o2

在Java中的内存级别会发生什么?

以下是我的实际代码:

我正在做什么:我创建了一个类型为Types.AdjList的元素集TSet,现在我想要处理Types.AdjList类型的每个连续元素对,并在每次迭代期间将迭代器值分配给两个Types.AdjList变量T1和T2。但是T1和T2属性与迭代器所具有的不匹配。

P.S。 Types.AdjList是一个HashMap

for (int i=0; i<numT; i++) {
        size = generator.nextInt(10)+1;
        T[i] = new Types().new AdjList(size);
}
HashSet<Types.AdjList> TSet = new HashSet<Types.AdjList>(); 
    for (int i=0; i<T.length; i++) {
        TSet.add(T[i]);
    }
Types.AdjList T1 = null, T2 = null;

for (Iterator<Types.AdjList> itr = TSet.iterator(); itr.hasNext();) {
        T1 = itr.next();
        if (T2 != null) {
            size1 = T1.adj.size();
            //size1 is returning 0, though T1.adj has some elements
            size2 = T2.adj.size();
            //do some processing on T1, T2 based on size1 and size2         
        }
        T2 = T1;
}

任何帮助将不胜感激。

谢谢,

索姆纳特

4 个答案:

答案 0 :(得分:3)

您的代码没有任何问题,但可以使用一些清理工具。

如果您应用这些“最佳实践”编码标准:

  • 始终声明抽象类型(即Set not HashSet)
  • 使用变量的前导小写名称(set not Set)
  • 尽可能使用“foreach”语法(不要直接使用迭代器)
  • 声明变量,使它们具有尽可能小的范围(o过去使用它)

您将代码重构为:

for (Object o : new HashSet<Object>(someSet)) {
    // doing some processing on o
}

甚至

for (Object o : someSet) { // Not sure why you wanted to make a new Set
    // doing some processing on o
}

答案 1 :(得分:1)

t2从哪里设定?看起来它对我来说总是空的,因此if语句永远不会被执行。在那里设一个断点,看看会发生什么。

答案 2 :(得分:0)

我们不再在Java中使用迭代器了:

我们使用'in'

ArrayList<String> stringList = new ArrayList<String>();
// initialize it with code (not shown)
for (String s: stringList) {
   System.out.println("the current element is:" + s);
}

答案 3 :(得分:-2)

你没有正确迭代。

你需要做


HashSet set = ...
Iterator _i = set.iterator();
while(_i.hasNext()) {
   Object o = _i.next();
}

从那里开始。

另外,关于你的问题

o1 = o2

记忆没有任何反应。在java中,一切都是基元或类。所有类都驻留在堆中,因此o1 = o2只是将指向o2的指针复制到变量o1。如果o2是基元,则将值(而不是指针)复制到o1