2013-10-16 20 views
1

我對Java相當陌生,我一直試圖解決以下問題失敗。刪除列表<String>重複使用等於

編寫一個Java方法,該方法將刪除給定列表中的重複項。

假設:

  1. 方法接受類型列表
  2. 返回類型是使用equals()

主要確定void

  • 重複:

    1. 創建的即時列出並加載重複的字符串值
    2. 調用removeDuplicates(),通過此列表
    3. 將修改後的列表輸出到控制檯。

    我可以通過將我的列表傳遞給一個新的HashSet並將其複製回來來解決問題。 但問題是:

    1. 問題是問我用equals()...
    2. 如果返回類型是void解決它,我怎麼能輸出它在main

    import java.util。*; 公共類問題1 {

    public static void main(String[] args) { 
    String[] words = {"good","better", "best", "best", "first" , "last", "last", "last", "good"}; 
         List<String> list = new ArrayList<String>(); 
         for (String s : words) { 
          list.add(s); 
         } 
         removeDuplicates(list); 
        } 
        static void removeDuplicates(List<String> array){ 
         HashSet<String> hs = new HashSet<>(); 
         hs.addAll(array); 
         array.clear(); 
         array.addAll(hs); 
         for (String x : array){ 
          System.out.println(x); 
         } 
        } 
    } 
    

    編輯:好了,這一個工程,但你可以我沒有使用equals()方法,我從我的靜態方法打印出來,而不是從主看。 此外,有什麼辦法可以比使用String []更快地填充列表?

  • +2

    把你的代碼,工作或沒有。 –

    +5

    通緝:編碼。死或生。 – Maroun

    +1

    @MarounMaroun獎肯定是個很好的答案:P –

    回答

    1

    這裏是你會怎麼做同樣的事情,而不使用Set,只是使用equals()(也有所回答關於初始化List你的「編輯」的問題) :

    public static void main(String[] args) { 
        List<String> list = new ArrayList<String>(Arrays.asList(new String[] { 
         "good", "better", "best", "best", "first", "last", "last", "last", 
         "good"})); 
        removeDuplicates(list); 
        for (String x : list) { 
         System.out.println(x); 
        } 
        } 
    
        static void removeDuplicates(List<String> array) { 
        for (int i = 0; i < array.size(); i++) { 
         String next = array.get(i); 
    
         // check if this has already appeared before 
         for (int j = 0; j < i; j++) { 
         // if it has, stop the search and remove it 
         if (next.equals(array.get(j))) { 
          array.remove(i); 
          // decrement i since we just removed the i'th element 
          i--; 
          // stop the search 
          break; 
         } 
         } 
        } 
        } 
    

    也就是說,使用HashSet是一個更好的主意,因爲前面已經指出了它更加高效。

    如果你想的HashSet效率,但仍維持秩序的List你可以做這樣的事情:

    static void removeDuplicates(List<String> array) { 
        Set<String> set = new HashSet<String>(); 
    
        for (int i = 0; i < array.size(); i++) { 
         String next = array.get(i); 
    
         // check if this has already appeared before 
         if (!set.add(next)) { 
         // if it has then remove it 
         array.remove(i); 
         // decrement i since we just removed the i'th element 
         i--; 
         } 
        } 
        } 
    
    +0

    爲什麼不使用'LinkedHashSet'來代替訂單? –

    3

    java.util.HashSet在其實現Set.add(Object)中使用Object.equals(Object)來確定被插入的元素是唯一的(由不等於另一個元素定義)。 HashSet還具有允許您在O(n)時間內執行重複數據刪除過程的優勢,比較比較每個元素與O(n^2)時間中的每個其他元素的更幼稚方法。

    main中的代碼將看到修改列表,因爲List對象是可變的。當一個方法改變傳入參數的狀態時,調用代碼將會看到這些改變。

    2
    1. removeDuplicates創建set,然後迭代輸入列表。如果在輸入列表中遇到一個元素,該元素也在該集合中,則removeDuplicates將從輸入列表中刪除該元素,否則將該元素添加到該集合中。
    2. Java是一個按參考調用語言(sort of)。這意味着,方法removeDuplicates可以修改它接收的List<String> array,並且調用者在返回removeDuplicates的調用之後將看到該修改的列表。
    1

    可能最簡單的方法是首先使用Set,根據定義它不允許重複。

    爲您的實際問題,你可以做幾種方法:

    • 的容易,但慢的辦法:每一個元素與列表中的相互N元素進行比較。如果A.equals(N)刪除N.提示:您只需要將A與每個其他元素進行比較,因爲您已經檢查過每個元素A.

    • 更快的方法:使用自然的comperator對列表進行排序。現在,您不再需要比較每個元素A和N,但只需要比較A和下幾個元素。準確地說:直到你找到第一個不等於A的元素。在這種情況下,你可以假設A沒有更多的重複(歸功於排序),並繼續下一個元素爲A.

    • Map方法(快速但需要更多內存):對於放入列表中的每個元素,將相同的元素放入具有任何Object的Map中作爲值。現在,您可以查找該元素是否已經在地圖中,如果是,則是重複的。

    最好的方法是第二種方法,因爲排序非常快,您只需要獲取每個元素一次,並且不需要第二個列表。

    編輯:在代碼中的第2個方法:

    static void removeDuplicates(List<String> array) { 
        if (array.size() <= 1) { 
        return; 
        } 
        Collections.sort(array); 
        final Iterator<String> it = array.iterator(); 
        String a = it.next(), n; 
        while (it.hasNext()) { 
        n = it.next(); 
        if (((a == null) && (n != null)) 
          || ((a != null) && (a.equals(n) == false))) { 
         a = n; 
        } else { 
         it.remove(); 
        } 
        } 
    }