2013-12-10 39 views
0

因此,我的任務是創建一個從MultiSet中刪除元素的方法。我一直在嘗試一段時間,但可悲的是徒勞。我的代碼如下:從MultiSet中刪除

import java.util.*; 

public class MultiSet<E> extends AbstractCollection<E> { 

private HashMap<E, Integer> elements; 
private int noOfElems; 

public MultiSet() { 
    elements = new HashMap<E, Integer>(); 
    noOfElems= 0; 
} 

public MultiSet(Collection<E> c) { 
    this(); 
    addAll(c); 
} 

public int size() { 
    return noOfElems; 
} 

public Iterator<E> iterator() { 
    return new Iterator<E>() { 
     Iterator<E> iterator = elements.keySet().iterator(); 
     int elemsLeft = 0; 
     E thisElem = null; 

     public boolean hasNext() { 
      return iterator.hasNext(); 
     } 

     public E next() { 
      if (elemsLeft == 0) { 
       thisElem = iterator.next(); 
       elemsLeft = elements.get(thisElem); 
      } 

      elemsLeft -= elemsLeft; 
      return null; 
     } 

     public void remove() { 
      throw new UnsupportedOperationException(); 
     } 
    }; 
} 

public boolean add(E e) { 
    Integer i = elements.get(e); 
    if(i == null) { 
     i = 1; 
    } else { 
     i += 1; 
    } 

    elements.put(e, i); 
    noOfElems++; 
    return true; 
} 

public String toString() { 
    return elements.toString(); 
} 

public int hashCode() { 
    return elements.hashCode(); 
} 

public boolean equals(MultiSet<E> other) { 

    if (this == other) { 
     return true; 
    } 

    if (other == null) { 
     return false; 
    } 

    if (this.getClass() != other.getClass()) { 
     return false; 
    } 

    MultiSet<?> obj = (MultiSet<?>) other; 
    return obj.elements.equals(elements); 
    } 

    public boolean remove(Object o) { 

    } 
} 

而我想執行remove方法。任何能夠幫助我的東西,甚至是從哪裏開始的幾點提示,都將不勝感激。謝謝! (同樣,我的代碼的其他評論也將不勝感激)

回答

0

此multiset只存儲作爲哈希鍵映射到發生次數的計數的元素。要刪除一個元素的所有實例,只是刪除鍵值:

public void remove_all(E e) { 
    elements.remove(e); 
} 

如果您需要刪除只有一個實例,然後再遞減計數,除非它已經是一個1。在這種情況下,拔出鑰匙。

public void remove(E e) { 
    Integer i = elements.get(e); 
    if (i != null) { 
    if (i == 1) { 
     elements.remove(e); 
    } else { 
     elements.put(e, i - 1); 
    } 
    } 
} 

順便說一句,這是有點難以相信這是你的代碼。如果你有足夠的理解來寫出你已經寫過的方法,那麼你怎麼也不知道從哪裏開始remove