我的MultiSet类的一些方法存在一些问题。 这是一个测试人员,MultiSet类应该得到输出:“Succes!”如果它正常工作。 这是测试人员:
public class MultiSetTest {
public static void main(String[] args) {
MultiSet<String> a = new MultiSet<String>();
MultiSet<String> b = new MultiSet<String>();
a.add("Foo");
a.add("Bar");
a.add("Foo");
System.out.println("a:" + a); // test toString
b.add("Bar");
b.add("Foo");
b.add("Bar");
b.add("Foo");
System.out.println("b:" + b);
assert !a.equals(b) : "Failed test 1!"; // test equals
assert b.remove("Bar") : "Failed test 2!"; // test remove
assert a.equals(b) : "Failed test 3!";
for(String s : a) { // test iterator
assert b.remove(s) : "Failed test 4!";
}
assert b.size() == 0 : "Failed test 5!";
Set<String> baseSet = new HashSet<String>(a);
assert baseSet.size()==2 : "Failed test 6!";
b = new MultiSet<String>(a);
assert a.equals(b) : "Failed test 7!";
try {
assert false;
System.out.println("Please enable assertions!");
}
catch(AssertionError e) {
System.out.println("Success!");
}
}
}
我的Multiset课程:
public class MultiSet<E> extends AbstractCollection<E>
{
private int size = 0;
private Map<E, Integer> values = new HashMap<E, Integer>();
public MultiSet()
{
}
public MultiSet(Collection<E> c)
{
addAll(c);
}
public boolean add()
{
return false;
}
public boolean remove()
{
return false;
}
public Iterator<E> iterator()
{
return new Iterator<E>()
{
private Iterator<E> iterator = values.keySet().iterator();
private int remaining = 0;
private E current = null;
public boolean hasNext()
{
return remaining > 0 || iterator.hasNext();
}
public E next()
{
if (remaining == 0)
{
current = iterator.next();
remaining = values.get(current);
}
remaining--;
return current;
}
public void remove()
{
throw new UnsupportedOperationException();
}
};
}
public boolean equals(Object object)
{
if (this == object) return true;
if (this == null) return false;
if (this.getClass() != object.getClass()) return false;
MultiSet<E> o = (MultiSet<E>) object;
return o.values.equals(values);
}
public int hashCode()
{
return values.hashCode()*163 + new Integer(size).hashCode()*389;
}
public String toString()
{
String res = "";
for (E e : values.keySet());
//res = ???;
return getClass().getName() + res;
}
public int size()
{
return size;
}
}
也许如果您可以通过添加或删除方式帮助我,那么我可能可以使用另一个。
另外,我的等号似乎无法正常工作, 我不确定如何在String toString中找出“res”。不要介意我的退货声明,我会稍后抛出一些括号等,以使它看起来不错。
感谢您的帮助。 //克里斯
答案 0 :(得分:2)
为什么不使用经过充分测试的Google Guavas's Multiset而不是重新发明轮子?您可以选择众多实现中的一种:
应该涵盖您的用例或 - 如果您真的想要 - 自己实现Multiset接口,查看默认实现的来源。
修改强>
您的实施中断了Collecion
界面合约 - 您无法返回false
add(E e)
。阅读Collection docs:
<强>
boolean add(E e)
强>参数:
e
- 确保在此集合中存在的元素返回:
true
如果此集合因调用而改变抛出:
UnsupportedOperationException
- 如果此集合不支持添加操作
如果您想使用只读Multiset,请使用ImmutableMultiset
(更具体地说,ImmutableMultiset.copyOf(Iterable))或实施Multiset
抛出add(E e)
的接口UnsupportedOperationException
方法。