2013-12-10 83 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