我有一段这样的代码:
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;
}
任何帮助将不胜感激。
谢谢,
索姆纳特
答案 0 :(得分:3)
您的代码没有任何问题,但可以使用一些清理工具。
如果您应用这些“最佳实践”编码标准:
您将代码重构为:
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