2014-10-22 58 views
0

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

我有对象的排序列表(不阵列),说:

 
apple 
apple 
pear 
pear 
pear 
peach 

我目前使用我的名单上的迭代函数“for”循环。

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

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

 
apple 
pear 
peach 

谢谢。

+0

只记得最后处理的项目,并跳过处理,而当前项目与它相同。 – Blorgbeard 2014-10-22 00:10:27

+1

什么语言?你尝试使用什么? – 2014-10-22 00:14:05

+0

你有什么试过的?你发现了什么问题?您发布的代码将删除所有内容。 – 2014-10-23 02:25:59

回答

0

使用列表迭代器是在迭代从列表中删除项目的安全方法:下面的代码示例你想要做什么(不需要创建副本列表):

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 
0

好,你有一个排序列表..然后你需要不重复的元素创建另一个列表,而你迭代它,你不能编辑列表,除非你使用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

+0

好的。那是我需要的。由于我需要统计频率,所以我需要原始列表来完成。但是,再次设置没有重复元素的Set可以让我无需重复输出。谢谢。 – Dave 2014-10-22 00:34:18

0

您可以使用remove()ListIterator当电流word配衬以前word。像,

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]