【问题标题】:Removing repeating elements in a sorted list [closed]删除排序列表中的重复元素[关闭]
【发布时间】:2014-12-17 08:53:00
【问题描述】:

如何在迭代时删除排序列表中的重复元素?

我有一个对象的排序列表(不是数组),比如:

苹果 苹果 梨 梨 梨 桃子

我目前在列表中使用带有 Iterator 函数的“for”循环。

for(ListIterator<String> iter = list.listIterator();iter.hasNext();) {
  String it = iter.next();
  System.out.println(it+" - "+Collections.frequency(list.it));
  iter.remove();
}

当我存储了第一个“苹果”后,我希望从列表中完全删除其他“苹果”条目,以便列表中的下一个项目将是“梨”。当我存储第一个“梨”时,我希望从列表中删除所有重复的“梨”元素,以便下一个元素是桃子。完成迭代后,我应该只有三个元素:

苹果 梨 桃子

谢谢。

【问题讨论】:

  • 只记得上次处理的项目,当当前项目与它相同时跳过处理。
  • 什么语言?您尝试使用什么?
  • 你试过什么?你发现了什么问题?您发布的代码会删除所有内容。

标签: java list iteration


【解决方案1】:

使用列表迭代器是一种在迭代时从列表中删除项目的安全方法:以下代码示例可以满足您的需求(无需创建重复的列表):

public class RemoveDuplicates
{
    public static void main(String... args)
    {
        List<String> list = new ArrayList<>();
        list.add("apple");
        list.add("apple");
        list.add("pear");
        list.add("pear");
        list.add("pear");
        list.add("peach");

        System.out.println("Original list: ");
        for (String s : list)
            System.out.println(s);

        String temp = "";
        for (Iterator<String> iterator = list.iterator(); iterator.hasNext();)
        {
            String s1 = iterator.next();
            if (temp.equals(s1))
            {
                iterator.remove();
            }
            temp = s1;
        }

        System.out.println("\nProcessed list:");
        for (String s : list)
            System.out.println(s);
    }
}

程序输出:

Original list:
apple
apple
pear
pear
pear
peach

Processed list:
apple
pear
peach

【讨论】:

    【解决方案2】:

    当当前word 与前一个word 匹配时,您可以在List Iterator 上使用remove()。喜欢,

    List<String> al = new ArrayList<>(Arrays.asList("apple", "apple",
            "pear", "pear", "pear", "peach"));
    String str = null;
    Iterator<String> iter = al.iterator();
    while (iter.hasNext()) {
        String word = iter.next();
        if (!word.equals(str)) {
            str = word;
        } else {
            iter.remove();
        }
    }
    System.out.println(al);
    

    输出

    [apple, pear, peach]
    

    【讨论】:

      【解决方案3】:

      好吧,你有一个排序列表..那么你需要创建另一个没有重复元素的列表,你不能在迭代列表时编辑它,除非你使用Iterator

      List<String> newFruitList = new LinkedList<String>();
      String lastFruit = null;
      for (String fruit : yourSortedList) {
         if (lastFruit == null || !lastFruit.equals(fruit)) {
             newFruitList.add(fruit);
             lastFruit = fruit;
         }
      }
      

      顺便说一下,在java定义中:

      • 列表:可以有重复的元素
      • 设置:不能有重复的元素

      另一件事,如果您需要像 Tree 这样排序的东西,我会建议您使用另一种数据结构,它是排序的并且更快 O(log n)... 在您的情况下寻找 TreeSet

      【讨论】:

      • 嗯,好的。这正是我所需要的。因为我需要统计一个频率,所以我需要原始列表来这样做。但是,制作没有重复元素的第二个 Set 允许我输出不重复。谢谢。
      猜你喜欢
      • 1970-01-01
      • 2013-04-28
      • 1970-01-01
      • 1970-01-01
      • 2021-02-26
      • 2020-01-19
      • 1970-01-01
      • 2020-08-02
      • 2018-05-02
      相关资源
      最近更新 更多