0

我试图让这个简单的 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

4 回答 4

5

你需要使用.clone()

LinkedList<T> retList = (LinkedList<T>) lista.clone();

此外,您需要使用迭代器从LinkedList循环中的一段时间中删除。看到这个答案

于 2013-05-22T18:39:38.880 回答
5

简单的解决方案是使用 Set。在您的情况下,您可以使用。

public Set<T> toSet() {
   return new LinkedHashSet<T>(lista);
}
于 2013-05-22T18:43:06.543 回答
1

你说这是一个练习,我在这里假设目标是生成一个表示集合(没有重复)的列表,而不使用Set集合。

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

  1. 新建一个空的Map<T, Object>.
  2. 创建一个对象作为值,一个简单的new Object()就足够了。
  3. 新建一个空的LinkedList<T>. 这是您将返回的列表。
  4. Iterator<T>从您的列表中创建一个。这可以通过lista.iterator().
  5. 迭代您的列表,而您的迭代器hasNext()
    1. 检索当前元素,使用您的迭代器的next().
    2. 检查您的 mapcontainsKey()是否是 5.1 中检索到的元素。
      • 如果是这样,则该元素是重复的,您不会将其添加到新列表中。跳过。
      • 如果不是,则该元素是新鲜的,因此您add()将其添加到新列表中,并将put()其在映射中作为键,指向在 2 中创建的占位符值。
    3. 重复5,即循环继续。
  6. 返回没有重复的新列表。
于 2013-05-22T19:13:38.950 回答
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;
}
于 2013-05-22T18:41:38.600 回答