我正在努力使这个简单的Java练习工作,但它没有,我无法理解为什么。
这是我的代码:
public LinkedList<T> toSet()
{
LinkedList<T> retList;
retList = lista;
for(T elem1 : retList)
for(T elem2 :retList)
{
if(retList.indexOf(elem1) == retList.indexOf(elem2))
continue;
else if(elem1.equals(elem2))
retList.remove(elem1);
}
return retList;
}
该方法应删除列表中出现多次的元素。我用eclipse对它进行了调试,发现retList.remove(elem1)
使列表保持不变!
我的错误在哪里?
答案 0 :(得分:5)
您需要使用.clone()
LinkedList<T> retList = (LinkedList<T>) lista.clone();
此外,您需要使用迭代器在循环中从LinkedList
中删除。请参阅此SO answer。
答案 1 :(得分:5)
简单的解决方案是使用Set。在您的情况下,您可以使用。
public Set<T> toSet() {
return new LinkedHashSet<T>(lista);
}
答案 2 :(得分:1)
使用for-each循环迭代列表时,无法从列表中删除项目。您应该使用迭代器:
public LinkedList<T> toSet()
{
LinkedList<T> retList;
retList = lista;
Iterator<T> iter1 = retList.iterator();
int index1 = 0;
while (iter1.hasNext()) {
T elem1 = iter1.next();
Iterator<T> iter2 = retList.iterator();
int index2 = 0;
while (iter2.hasNext())
{
T elem2 = iter2.next();
if(index1 != index2 && elem1.equals(elem2))
iter2.remove();
index2++;
}
index1++;
}
return retList;
}
答案 3 :(得分:1)
你说这是一个练习,我假设这里的目标是生成一个代表一组(没有重复)的列表,而不使用Set
个集合。
由于这是一项练习,我不会提供完整的代码,但我会提供与其他答案不同的方法。
Map<T, Object>
。new Object()
就足够了。LinkedList<T>
。这是您将返回的列表。Iterator<T>
。这可以通过lista.iterator()
完成。hasNext()
:
next()
。containsKey()
,这是在5.1中检索的元素。
add()
将其添加到新列表中,并将put()
它作为键在地图中指向2中创建的占位符值