Реализация мешка как массива в Java - PullRequest
2 голосов
/ 04 ноября 2010

Я должен реализовать структуру данных пакета (также называемую мультимножеством), неупорядоченную коллекцию однородных значений (любой объект Java, за исключением нуля), которые могут иметь дубликаты, для проекта.Я много занимался поиском в интернете, но мне трудно было использовать массивы вместо чего-то вроде List, и я не совсем понимаю синтаксис использования массивов в классе.

Мне нужно реализоватьвсе java.util.Collection, за исключением случаев, отмеченных исключением UnsupportedOperationException.Да, я ДОЛЖЕН использовать массив, и когда я добавляю его, емкость должна увеличиться на 10. Моя проблема в том, что я не уверен, что делать с методом содержит , очистить *Метод 1006 *, метод addAll и второй конструктор .Надеюсь, все остальное, что я добавил, также будет работать гладко.Я включил определение API в блоки комментариев.Любой ввод вообще очень помог бы мне.

Как спросил Марк ниже, я не понимаю, как искать в сумке для поиска определенного элемента.

import java.util.Collection;
import java.util.Iterator;

class Bag<T> implements Collection<T>{
private T[] array;
public int bagSize;


public Bag(){
    array=(T[])new Object[10];
}
public Bag(Collection<T> other ){
    //Not sure what to put here
    //creates a bag containing all of the items passed to it as a Collection<T>
}

public int size() {
    return bagSize; 
}

public boolean isEmpty() {
    if(size()==0)
        return true;
    else
        return false;
}


public boolean contains(Object o) {
    //Not sure what to put here
    /*Returns true if this collection contains the specified element. More formally,
    returns true if and only if this collection contains at least one element e such 
    that (o==null ? e==null : o.equals(e)). */
    return (o.toArray()==null ? this.toArray()==null : o.toArray() == this.toArray());
    }

}


public Iterator<T> iterator() {
    throw new UnsupportedOperationException("not implemented.");
}

public Object[] toArray() {
    return array;

}

public <T> T[] toArray(T[] a) {
    throw new UnsupportedOperationException("not implemented.");
}

public boolean add(T e) {
   if(bagSize>=array.length)
       return false;
   else
   {
       ensureCapacity(bagSize+10);
       array[bagSize]=e;
       bagSize++;
       return true;
   }

}

public boolean remove(Object o) {
    for(int i=0; i<bagSize; i++)
        if(array[i].equals(o)){
            for(int j=i; j<bagSize-1; j++)
                array[j]=array[j+1];
            bagSize--;
            return true;
        }
    return false;

}

public boolean containsAll(Collection<?> c) {
    throw new UnsupportedOperationException("not implemented.");
}

public boolean addAll(Collection<? extends T> c) {
    //Not sure what to put here
    /*Adds all of the elements in the specified collection to this collection  
    (optional operation). The behavior of this operation is undefined if the specified
    collection is modified while the operation is in progress. (This implies that the
    behavior of this call is undefined if the specified collection is this collection,
    and this collection is nonempty.) */
}

public boolean removeAll(Collection<?> c) {
    throw new UnsupportedOperationException("not implemented.");
}

public boolean retainAll(Collection<?> c) {
    throw new UnsupportedOperationException("not implemented.");
}

public void clear() {
    //Not sure what to put here
    /*Removes all of the elements from this collection (optional operation). The
    collection will be empty after this call returns (unless it throws an exception).*/
}

@Override
public int hashCode(){
    throw new UnsupportedOperationException("not implemented.");
}

@Override
public boolean equals(Object e) {
    if (e == null) {
        return false;
    }
    if (getClass() != e.getClass()) {
        return false;
    }
    final Bag<T> other = (Bag<T>) e;
    return true;
}

public void ensureCapacity(int minCapacity){
    T[] biggerArray;
    if(array.length<minCapacity){
        biggerArray=(T[]) new Object[minCapacity];
        System.arraycopy(array, 0, biggerArray, 0, bagSize);
        array=biggerArray; 
    }
}

Ответы [ 2 ]

3 голосов
/ 04 ноября 2010

Я не совсем понимаю, что у вас внутри contains ... вы звоните toArray() на Object, у которого нет метода toArray().Это говорит о некотором фундаментальном недопонимании того, что вы пытаетесь сделать.Несмотря на это, вы действительно, похоже, знаете, как проверить, содержит ли коллекция данный объект, потому что вам нужно найти объект, чтобы remove его найти.Ваш метод remove возвращает точно такое же значение boolean, которое contains будет иметь при вызове с тем же объектом.Я думаю, что вы можете работать с этим.

(Ваш метод remove имеет ошибку, которая может вызвать утечку памяти, кстати ... когда он перемещает объекты в массиве влево на 1,он не устанавливает для слота массива, который больше не входит в коллекцию, значение null.)

addAll довольно просто ... вам дано Collection элементов, которые нужны всембыть добавленным, и у вас есть метод add, который может добавить элемент.Они идут вместе.(addAll - это все, что вам действительно нужно для реализации вашего второго конструктора.)

clear также прост.После его вызова ваш массив не должен иметь ссылок на какие-либо объекты, а размер вашей сумки должен быть равен 0. Просто подумайте, как вы можете это сделать.

Работающая реализация iterator() поможет вамМожно использовать несколько Collection методов (включая clear), используя Iterator коллекции (это делает удобный абстрактный класс AbstractCollection), но реализовать это немного сложнее, чем просто реализовать

Кроме того, небольшая заметка.

public boolean isEmpty() {
    if(size()==0)
        return true;
    else
        return false;
}

лучше написать в виде:

public boolean isEmpty() {
  return size() == 0;
}

Так какsize() == 0 уже является выражением boolean, if / else является избыточным.

0 голосов
/ 04 ноября 2010

Вы можете использовать реализацию Multiset в guava в качестве ссылки. Это даст вам некоторую идею http://guava -libraries.googlecode.com / SVN / багажник / SRC / COM / Google / общие / собирать /

...