2014-10-22 108 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]