2015-02-05 14 views
3

Так что у меня возникло много проблем с концептуализацией ответов на следующие вопросы. Я не ищу ответов, но, скорее, полезные шаги, которые я могу предпринять, это позволит мне представить ответы самостоятельно. Примечание: для ответа на эти вопросы мне даются классы и драйвер. Возникают следующие вопросы:удалить и заменить методы для java

Q.1 Внесите замену метода для сумки ADT, которая заменяет и возвращает любой объект, находящийся в настоящее время в сумке, с заданным объектом .

Q.2.Запустите метод удаления, чтобы удалить каждый экземпляр элемента в массиве ArrayBag.

Q.3. Дайте, по крайней мере, два примера ситуации, когда фиксированный пакет является подходящим, и два примера ситуации, когда подходящий размерный мешок подходит.

Следующий код, что я начал, но я не уверен, если я нахожусь в правильном направлении:

a.1 public T replace(T theItem) { 
    Random generator = new Random(); 
    int randomPosition = generator.nextInt(numberOfEntries); 

    T result = null; 

    if (!isEmpty() && (randomPosition >= 0)) { 
     result = bag[randomPosition]; // Entry to remove 
     bag[randomPosition] = theItem; // Replace entry to remove with 
           // last entry 

    } 
    return result; 
a.2 public void clear(T theItem) { 
    while (!this.isEmpty(ArrayBag)) 
     this.remove(); 

a.3 not sure it should be related to coding examples or something else. 

Кроме того, класс для ArrayBag ниже для справки:

import java.util.Arrays; 
import java.util.Random; 

public final class ArrayBag<T> implements BagInterface<T> { 
private final T[] bag; 
private int numberOfEntries; 
private boolean initialized = false; 
private static final int DEFAULT_CAPACITY = 25; 
private static final int MAX_CAPACITY = 10000; 

/** Creates an empty bag whose initial capacity is 25. */ 
public ArrayBag() { 
    this(DEFAULT_CAPACITY); 
} // end default constructor 

/** 
* Creates an empty bag having a given capacity. 
* 
* @param desiredCapacity 
*   The integer capacity desired. 
*/ 
public ArrayBag(int desiredCapacity) { 
    if (desiredCapacity <= MAX_CAPACITY) { 
     // The cast is safe because the new array contains null entries 
     @SuppressWarnings("unchecked") 
     T[] tempBag = (T[]) new Object[desiredCapacity]; // Unchecked cast 
     bag = tempBag; 
     numberOfEntries = 0; 
     initialized = true; 
    } else 
     throw new IllegalStateException("Attempt to create a bag " 
       + "whose capacity exceeds " + "allowed maximum."); 
    } // end constructor 

    /** 
    * Adds a new entry to this bag. 
    * 
    * @param newEntry 
    *   The object to be added as a new entry. 
    * @return True if the addition is successful, or false if not. 
*/
    public boolean add(T newEntry) { 
    checkInitialization(); 
    boolean result = true; 
    if (isArrayFull()) { 
     result = false; 
    } else { // Assertion: result is true here 
     bag[numberOfEntries] = newEntry; 
     numberOfEntries++; 
    } // end if 

    return result; 
    } // end add 

/** 
* Retrieves all entries that are in this bag. 
* 
* @return A newly allocated array of all the entries in this bag. 
*/ 
public T[] toArray() { 
    checkInitialization(); 

    // The cast is safe because the new array contains null entries. 
    @SuppressWarnings("unchecked") 
    T[] result = (T[]) new Object[numberOfEntries]; // Unchecked cast 

    for (int index = 0; index < numberOfEntries; index++) { 
     result[index] = bag[index]; 
    } // end for 

    return result; 
    // Note: The body of this method could consist of one return statement, 
    // if you call Arrays.copyOf 
} // end toArray 

/** 
* Sees whether this bag is empty. 
* 
* @return True if this bag is empty, or false if not. 
*/ 
public boolean isEmpty() { 
    return numberOfEntries == 0; 
} // end isEmpty 

/** 
* Gets the current number of entries in this bag. 
* 
* @return The integer number of entries currently in this bag. 
*/ 
public int getCurrentSize() { 
    return numberOfEntries; 
} // end getCurrentSize 

/** 
* Counts the number of times a given entry appears in this bag. 
* 
* @param anEntry 
*   The entry to be counted. 
* @return The number of times anEntry appears in this ba. 
*/ 
public int getFrequencyOf(T anEntry) { 
    checkInitialization(); 
    int counter = 0; 

    for (int index = 0; index < numberOfEntries; index++) { 
     if (anEntry.equals(bag[index])) { 
      counter++; 
     } // end if 
    } // end for 

    return counter; 
} // end getFrequencyOf 

/** 
* Tests whether this bag contains a given entry. 
* 
* @param anEntry 
*   The entry to locate. 
* @return True if this bag contains anEntry, or false otherwise. 
*/ 
public boolean contains(T anEntry) { 
    checkInitialization(); 
    return getIndexOf(anEntry) > -1; // or >= 0 
} // end contains 

/** Removes all entries from this bag. */ 
public void clear() { 
    while (!this.isEmpty()) 
     this.remove(); 
} // end clear 

/** 
* Removes one unspecified entry from this bag, if possible. 
* 
* @return Either the removed entry, if the removal was successful, or null. 
*/ 
public T remove() { 
    checkInitialization(); 
    T result = removeEntry(numberOfEntries - 1); 
    return result; 
} // end remove 

/** 
* Removes one occurrence of a given entry from this bag. 
* 
* @param anEntry 
*   The entry to be removed. 
* @return True if the removal was successful, or false if not. 
*/ 
public boolean remove(T anEntry) { 
    checkInitialization(); 
    int index = getIndexOf(anEntry); 
    T result = removeEntry(index); 
    return anEntry.equals(result); 
} // end remove 

public boolean removeRandom() { 
    Random generator = new Random(); 
    int randomPosition = generator.nextInt(numberOfEntries); 
    T result = removeEntry(randomPosition); 
    if (result == null) { 
     return false; 
    } else { 
     return true; 
    } 

} 

@Override 
public boolean equals(Object obj) { 
    if (obj instanceof ArrayBag) { 
     ArrayBag<T> otherArrayBag = (ArrayBag<T>) obj; 

     if (numberOfEntries == otherArrayBag.numberOfEntries) { 

      // I create new arrays so that I can manipulate them 
      // and it will not alter this.bag or otherArrayBag.bag 
      T[] currentBagTempArray = toArray(); 
      T[] otherBagTempArray = otherArrayBag.toArray(); 

      Arrays.sort(currentBagTempArray); 
      Arrays.sort(otherBagTempArray); 

      for (int i = 0; i < numberOfEntries; i++) { 
       if (!currentBagTempArray[i].equals(otherBagTempArray[i])) { 
        return false; 
       } 
      } 
      return true; 
     } else { 
      return false; 
     } 

    } else { 
     return false; 
    } 
} 

public ResizableArrayBag<T> createResizableArray() { 
    T[] currentBagContents = toArray(); 
    ResizableArrayBag<T> newBag = new ResizableArrayBag<T>(currentBagContents); 
    return newBag; 
} 

// Returns true if the array bag is full, or false if not. 
private boolean isArrayFull() { 
    return numberOfEntries >= bag.length; 
} // end isArrayFull 

// Locates a given entry within the array bag. 
// Returns the index of the entry, if located, 
// or -1 otherwise. 
// Precondition: checkInitialization has been called. 
private int getIndexOf(T anEntry) { 
    int where = -1; 
    boolean found = false; 
    int index = 0; 

    while (!found && (index < numberOfEntries)) { 
     if (anEntry.equals(bag[index])) { 
      found = true; 
      where = index; 
     } // end if 
     index++; 
    } // end while 

    // Assertion: If where > -1, anEntry is in the array bag, and it 
    // equals bag[where]; otherwise, anEntry is not in the array. 

    return where; 
} // end getIndexOf 

// Removes and returns the entry at a given index within the array. 
// If no such entry exists, returns null. 
// Precondition: 0 <= givenIndex < numberOfEntries. 
// Precondition: checkInitialization has been called. 
private T removeEntry(int givenIndex) { 
    T result = null; 

    if (!isEmpty() && (givenIndex >= 0)) { 
     result = bag[givenIndex]; // Entry to remove 
     int lastIndex = numberOfEntries - 1; 
     bag[givenIndex] = bag[lastIndex]; // Replace entry to remove with 
              // last entry 
     bag[lastIndex] = null; // Remove reference to last entry 
     numberOfEntries--; 
    } // end if 

    return result; 
} // end removeEntry 

// Throws an exception if this object is not initialized. 
private void checkInitialization() { 
    if (!initialized) 
     throw new SecurityException(
       "ArrayBag object is not initialized properly."); 
} // end checkInitialization 

} // end ArrayBag

ответ

0

Я посмотрел ваш стартовый код и класс, но я не запускал его. Но я могу сказать, что вы в правильном направлении.

Для Q2 вы должны искать данный элемент в массиве и удалять его. Потому что в вопросе четко сказано, что «удалить каждый экземпляр элемента». Проверьте метод getIndexOf(). Вы можете посмотреть, как искать и элемент. Если вы найдете одно из них, удалите его. Будьте осторожны, если вы удалите и элемент, пока вы итерируете его. Если вы удалите один элемент во время итерации, размер изменится. Я предлагаю вам хранить каждое соответствие по массиву. После использования итерации удаления (индекс) методы для каждого найденного элемента

Give at least two examples of a situation where a fixed bag is appropriate and two examples of a situation where a resizable bag is appropriate. 

Для этого элемента вы можете добавить некоторые пояснения и примеры кода или алгоритм. Я могу предложить вам две вещи:

1. If the array is not getting full too fast fixed size is good. But if array is getting full too fast you should resize new array and copy all elements again and again. Overhead amount is important. 
2. Amount of capacity is important. How you will decide initial size ? Big size or small size ? Think that 

Я надеюсь, что это помогает

+0

Спасибо emin! Могу ли я спросить при приближении к таким проблемам, как лучший план действий (т. Е. Просмотреть класс, найти похожие коды, которые я могу изменить для удовлетворения потребностей, посмотреть интерфейс и т. Д.). Также вы можете указать на все, что я могу потерять в целях ужесточения моих решений? –

+0

Конечно, вы можете спросить ... Я следую этой теме. Я говорю вам, если я вижу что-то не так. – emin

1

кто-то другой реализованный мешок с использованием массива в Bag Class Implementation in Java/Using Array. Я только взглянул на код, так что это может быть смешанная сумка.

Я предполагаю, что сумка подобна набору, за исключением того, что хранит один и тот же объект более одного раза. Вы хотели бы реализовать частную коллекцию некоторого рода (возможно, массив, как указано выше). Назовем это myBag. Поскольку вы используете общий тип T, ваша Сумка будет содержать только объекты типа T.

Для Q1 вам может потребоваться выполнить два параметра: объект, подлежащий замене (скажем findMe), и объект, который вы его заменяете (скажем replacement). Если сумка может содержать дубликаты, то вы, вероятно, захотите заменить первый объект, который соответствует. Вместо использования функции Random() вам может потребоваться пройти элемент по элементу через myBag и заменить найденный элемент тем, который вы заменяете. Возможно, вы захотите выбросить ошибку, если findMe не найден.Таким образом, объявление метода может быть что-то вроде:

public boolean replace(T findMe, T replacement) 

и возвращает истину, если FindMe был найден, иначе ложь.

Для Q2, вы можете создать то время цикла, который удаляет первый элемент в myBag в то время как размер myBag был> 0.

Для Q3, Автошоу НИКАКОГО кодирования участвует. Это мыслящий вопрос. В общем, сумка с фиксированным размером будет полезна, когда размер будет известен в начале, не изменится.

Изменимый размер сумки имеет смысл в большем количестве случаев, когда вы не знаете размер в начале и, скорее всего, сжимаетесь или вырастаете, например, список ожидания для класса.

+0

Спасибо, Раджа! Мой инструктор прямо заявил, что метод замены должен принимать только один параметр. Кроме того, вы на правильном пути, что сумка похожа на набор (или контейнер), и у него есть возможность хранить один и тот же объект более одного раза (неупорядоченный) –

+0

Раджа, Лиза прав. Вопрос ясно говорит, что «ЛЮБОЙ». Он ниже «Внедрите замену метода для сумки ADT, которая заменяет и возвращает ЛЮБОЙ объект в настоящее время в сумке с данным объектом». – emin

+0

Для Q2 раджа - это правильно. Но есть недостающая точка. Вы должны искать данный элемент в массиве и удалять его. Потому что вопрос ясно говорит, что «удалить каждый экземпляр элемента» Пожалуйста, проверьте метод getIndexOf. Вы можете посмотреть, как искать и элемент. Если вы найдете одно из них, удалите его. Будьте осторожны, если вы удалите и элемент, пока вы итерируете его. Если вы удалите один элемент во время итерации, размер изменится. Я предлагаю вам хранить каждое соответствие по массиву. После итерации используйте метод remove (index) для каждого найденного элемента. – emin