对于我的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!");
}
}
}还有我的多集课程:
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“。不要介意我的回复声明,我稍后会加上一些括号等,以使它看起来很好。
谢谢你的帮助。//克里斯
发布于 2011-12-09 14:52:22
为什么不使用经过良好测试的Google 番石榴多集而不是重新发明方向盘呢?您可以选择多种实现中的一种:
什么应该涵盖您的用例,或者--如果您真的想--自己实现多集接口,查看默认实现的来源。
编辑:
您的实现破坏了Collecion接口契约--您不能返回add(E e)的false。读取收藏文档
boolean add(E e)参数:e-将确保其在此集合中的存在。 返回: 如果由于调用而更改此集合,则为true。 抛出:UnsupportedOperationException-如果此集合不支持添加操作
如果您想使用只读多集,可以使用ImmutableMultiset (更具体地说是ImmutableMultiset.copyOf(可迭代))或实现Multiset的接口add(E e)方法抛出UnsupportedOperationException。
https://stackoverflow.com/questions/8446907
复制相似问题