MultiSet: проблемы с добавлением, удалением и равенством - PullRequest
1 голос
/ 09 декабря 2011

У меня есть некоторые проблемы с некоторыми из моих методов для моего класса 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;
        }
    }

Может быть, если бы вы могли помочь мне с добавлением или удалением, то я, вероятно, смогу поработать с другим.

Кроме того, мои равно не работают правильно, и я не уверен, как работать с "res" в String toString. Не возражайте против моего заявления о возврате, я добавлю несколько скобок и т. Д. Позже, чтобы оно выглядело хорошо.

Спасибо за вашу помощь. // Крис

1 Ответ

2 голосов
/ 09 декабря 2011

Почему бы не использовать хорошо проверенный Google Multiset от Guavas вместо того, чтобы изобретать велосипед?Вы можете выбрать одну из многих реализаций:

  • ConcurrentHashMultiset,
  • EnumMultiset,
  • ForwardingMultiset,
  • HashMultiset,
  • ImmutableMultiset,
  • LinkedHashMultiset,
  • TreeMultiset

что должно охватывать ваш вариант использования или - если вы действительно хотите - реализовать интерфейс Multiset самостоятельно, изучая источники реализаций по умолчанию.

РЕДАКТИРОВАТЬ:

Ваша реализация нарушает Collecion контракт интерфейса - вы не можете вернуть false для add(E e).Читать Сборник документов :

boolean add(E e)

Параметры:

e - элемент, присутствие которого вэта коллекция должна быть гарантирована

Возвращает:

true, если эта коллекция изменилась в результате вызова

Броски:

UnsupportedOperationException- если операция добавления не поддерживается этой коллекцией

Если вы хотите использовать Multiset только для чтения, используйте ImmutableMultiset (точнее ImmutableMultiset.copyOf (Iterable) )или реализуем Multiset интерфейс add(E e) метод throwing UnsupportedOperationException.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...