LinkedList中的方法remove()不起作用

时间:2013-05-22 18:35:24

标签: java

我正在努力使这个简单的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)使列表保持不变!

我的错误在哪里?

4 个答案:

答案 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个集合。

由于这是一项练习,我不会提供完整的代码,但我会提供与其他答案不同的方法。

  1. 创建一个新的空Map<T, Object>
  2. 创建一个用作值的对象,一个简单的new Object()就足够了。
  3. 创建一个新的空LinkedList<T>。这是您将返回的列表。
  4. 从列表中创建Iterator<T>。这可以通过lista.iterator()完成。
  5. 迭代您的列表,而迭代器hasNext()
    1. 使用迭代器的next()
    2. 检索当前元素
    3. 检查您的地图containsKey(),这是在5.1中检索的元素。
      • 如果是,则该元素是重复的,您不会将其添加到新列表中。 跳过。
      • 如果没有,则元素是新鲜的,因此您add()将其添加到新列表中,并将put()它作为键在地图中指向2中创建的占位符值
    4. 重复5,即循环继续。
  6. 返回没有重复项的新列表。