(In Java This will require that you use the ‘SetInterface’ of Chapter 1 instead
ID: 3888265 • Letter: #
Question
(In Java
This will require that you use the ‘SetInterface’ of Chapter 1 instead of the ‘BagInterface’ of Chapter 2. You will add the methods of the interface to the existing class. Then, develop a test application that will verify the functionality of the solution. You may wish to look at the example test applications.
As always, be sure to test ALL methods of the class and interface.
To Be Done:
- Open Resizable ArrayBag and rename as ArraySet.java - Global replace of ‘Bag’ with ‘Set’
- Re-write ‘add’ methods to prevent the addition of duplicate entries, using either the ‘contains’ method or ‘getIndexOf’
- We can remove ‘getFrequencyOf’ method.
- Update the test class – replace the ‘testGetFrequencyOf’ method and add a method to verify that duplicates can’t be added.)
****************// Resizable Bag code below//************
import java.util.Arrays;
/**
A class that implements a bag of objects by using an array.
The bag is never full.
@author Frank M. Carrano
@author Timothy M. Henry
@version 4.0
*/
public final class ResizableArrayBag implements BagInterface
{
private T[] bag; // Cannot be final due to doubling
private int numberOfEntries;
private boolean initialized = false;
private static final int DEFAULT_CAPACITY = 25; // Initial capacity of bag
private static final int MAX_CAPACITY = 10000;
/** Creates an empty bag whose initial capacity is 25. */
public ResizableArrayBag()
{
this(DEFAULT_CAPACITY);
} // end default constructor
/** Creates an empty bag having a given initial capacity.
@param initialCapacity The integer capacity desired. */
public ResizableArrayBag(int initialCapacity)
{
checkCapacity(initialCapacity);
// The cast is safe because the new array contains null entries
@SuppressWarnings("unchecked")
T[] tempBag = (T[])new Object[initialCapacity]; // Unchecked cast
bag = tempBag;
numberOfEntries = 0;
initialized = true;
} // end constructor
/** Creates a bag containing given entries.
@param contents An array of objects. */
public ResizableArrayBag(T[] contents)
{
checkCapacity(contents.length);
bag = Arrays.copyOf(contents, contents.length);
numberOfEntries = contents.length;
initialized = true;
} // end constructor
/** Adds a new entry to this bag.
@param newEntry The object to be added as a new entry.
@return True. */
public boolean add(T newEntry)
{
checkInitialization();
if (isArrayFull())
{
doubleCapacity();
} // end if
bag[numberOfEntries] = newEntry;
numberOfEntries++;
return true;
} // 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;
} // 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 (!isEmpty())
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
// 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
// Returns true if the array bag is full, or false if not.
private boolean isArrayFull()
{
return numberOfEntries >= bag.length;
} // end isArrayFull
// Doubles the size of the array bag.
// Precondition: checkInitialization has been called.
private void doubleCapacity()
{
int newLength = 2 * bag.length;
checkCapacity(newLength);
bag = Arrays.copyOf(bag, newLength);
} // end doubleCapacity
// Throws an exception if the client requests a capacity that is too large.
private void checkCapacity(int capacity)
{
if (capacity > MAX_CAPACITY)
throw new IllegalStateException("Attempt to create a bag whose capacity exceeds " +
"allowed maximum of " + MAX_CAPACITY);
} // end checkCapacity
// Throws an exception if receiving object is not initialized.
private void checkInitialization()
{
if (!initialized)
throw new SecurityException ("Uninitialized object used " +
"to call an ArrayBag method.");
} // end checkInitialization
} // end ResizableArrayBag
*****************// this is the setInterface code below//*********************
/**
An interface that describes the operations of a bag of objects.
@author Frank M. Carrano
@author Timothy M. Henry
@version 4.1
*/
public interface SetInterface
{
public int getCurrentSize();
public boolean isEmpty();
/** Adds a new entry to this set, avoiding duplicates.
@param newEntry The object to be added as a new entry.
@return True if the addition is successful, or
false if the item is already in the set. */
public boolean add(T newEntry);
/** Removes a specific entry from this set, if possible.
@param anEntry The entry to be removed.
@return True if the removal was successful, or false if not. */
public boolean remove(T anEntry);
public T remove();
public void clear();
public boolean contains(T anEntry);
public T[] toArray();
} // end SetInterface
Explanation / Answer
The ArraySet class is implemented by modifying the add() method as indicated in the question and the getFrequencyOf() is removed.
The question specifies to modify the existing test class, but since the existing code is not given, I have written a test program for the same.
Hope the answer helps. If it did, please don't foget to rate the answer. Thank you very much.
ArraySet.java
import java.util.Arrays;
/**
A class that implements a set of objects by using an array.
The set is never full.
@author Frank M. Carrano
@author Timothy M. Henry
@version 4.0
*/
public final class ArraySet<T> implements SetInterface<T>
{
private T[] set; // Cannot be final due to doubling
private int numberOfEntries;
private boolean initialized = false;
private static final int DEFAULT_CAPACITY = 25; // Initial capacity of set
private static final int MAX_CAPACITY = 10000;
/** Creates an empty set whose initial capacity is 25. */
public ArraySet()
{
this(DEFAULT_CAPACITY);
} // end default constructor
/** Creates an empty set having a given initial capacity.
@param initialCapacity The integer capacity desired. */
public ArraySet(int initialCapacity)
{
checkCapacity(initialCapacity);
// The cast is safe because the new array contains null entries
@SuppressWarnings("unchecked")
T[] tempSet = (T[])new Object[initialCapacity]; // Unchecked cast
set = tempSet;
numberOfEntries = 0;
initialized = true;
} // end constructor
/** Creates a set containing given entries.
@param contents An array of objects. */
public ArraySet(T[] contents)
{
checkCapacity(contents.length);
@SuppressWarnings("unchecked")
T[] tempSet = (T[])new Object[contents.length]; // Unchecked cast
set = tempSet;
initialized = true;
//if the contents has duplicates don't add, so call the method add()
for(int i = 0; i < contents.length; i++)
add(contents[i]);
} // end constructor
/** Adds a new entry to this set.
@param newEntry The object to be added as a new entry.
@return True. */
public boolean add(T newEntry)
{
checkInitialization();
//check for duplicate and don't add if already present
if(contains(newEntry))
return false;
if (isArrayFull())
{
doubleCapacity();
} // end if
set[numberOfEntries] = newEntry;
numberOfEntries++;
return true;
} // end add
/** Retrieves all entries that are in this set.
@return A newly allocated array of all the entries in this set. */
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] = set[index];
} // end for
return result;
} // end toArray
/** Sees whether this set is empty.
@return True if this set is empty, or false if not. */
public boolean isEmpty()
{
return numberOfEntries == 0;
} // end isEmpty
/** Gets the current number of entries in this set.
@return The integer number of entries currently in this set. */
public int getCurrentSize()
{
return numberOfEntries;
} // end getCurrentSize
/** Tests whether this set contains a given entry.
@param anEntry The entry to locate.
@return True if this set contains anEntry, or false otherwise. */
public boolean contains(T anEntry)
{
checkInitialization();
return getIndexOf(anEntry) > -1; // or >= 0
} // end contains
/** Removes all entries from this set. */
public void clear()
{
while (!isEmpty())
remove();
} // end clear
/** Removes one unspecified entry from this set, 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 set.
@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
// Locates a given entry within the array set.
// 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(set[index]))
{
found = true;
where = index;
} // end if
index++;
} // end while
// Assertion: If where > -1, anEntry is in the array set, and it
// equals set[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 = set[givenIndex]; // Entry to remove
int lastIndex = numberOfEntries - 1;
set[givenIndex] = set[lastIndex]; // Replace entry to remove with last entry
set[lastIndex] = null; // Remove reference to last entry
numberOfEntries--;
} // end if
return result;
} // end removeEntry
// Returns true if the array set is full, or false if not.
private boolean isArrayFull()
{
return numberOfEntries >= set.length;
} // end isArrayFull
// Doubles the size of the array set.
// Precondition: checkInitialization has been called.
private void doubleCapacity()
{
int newLength = 2 * set.length;
checkCapacity(newLength);
set = Arrays.copyOf(set, newLength);
} // end doubleCapacity
// Throws an exception if the client requests a capacity that is too large.
private void checkCapacity(int capacity)
{
if (capacity > MAX_CAPACITY)
throw new IllegalStateException("Attempt to create a set whose capacity exceeds " +
"allowed maximum of " + MAX_CAPACITY);
} // end checkCapacity
// Throws an exception if receiving object is not initialized.
private void checkInitialization()
{
if (!initialized)
throw new SecurityException ("Uninitialized object used " +
"to call an ArraySet method.");
} // end checkInitialization
} // end ArraySet
TestArraySet.java
import java.util.Arrays;
public class TestArraySet {
public static void main(String[] args) {
ArraySet<Integer> numbers = new ArraySet<Integer>();
System.out.println("current size = " + numbers.getCurrentSize() + " ") ; //should be 0
System.out.println("Adding 1, 2, 3");
numbers.add(1);
numbers.add(2);
numbers.add(3);
System.out.println("current size = " + numbers.getCurrentSize()); //should be 3
System.out.println(Arrays.toString(numbers.toArray()) + " ");
System.out.println("Adding 2, 3, 4");
numbers.add(2); //duplicate, should not be added
numbers.add(3); //duplicate, should not be added
numbers.add(4);
System.out.println("current size = " + numbers.getCurrentSize()); //should be 4
System.out.println(Arrays.toString(numbers.toArray()) + " ");
}
}
output
current size = 0
Adding 1, 2, 3
current size = 3
[1, 2, 3]
Adding 2, 3, 4
current size = 4
[1, 2, 3, 4]
Related Questions
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.