In: Computer Science
The implementations of the methods addAll, removeAll, retainAll are omitted in the MyList interface. Implement these methods.
/** Adds the elements in otherList to this list.
* Returns true if this list changed as a result of the call
*/
public default boolean addAll(Collection<? extends E> c)
/** Removes all the elements in otherList from this list
* Returns true if this list changed as a result of the call
*/
public default boolean removeAll(Collection<?> c)
/** Retains the elements in this list that are also in
otherList
* Returns true if this list changed as a result of the call
*/
public default boolean retainAll(Collection<?> c)
Write a test program that creates two MyArrayLists, list1 and
list2, with the initial values {"Tom", "George", "Peter", "Jean",
"Jane"} and {"Tom", "George", "Michael", "Michelle", "Daniel"},
then perform the following operations:
■ Invokes list1.addAll(list2), and displays list1 and list2.
■ Recreates list1 and list2 with the same initial values, invokes
list1.removeAll(list2), and displays list1 and list2.
■ Recreates list1 and list2 with the same initial values, invokes
list1.retainAll(list2), and displays list1 and list2.

package Feb23;
//TestMyArrayList.java
import java.util.*;
class MyArrayList<E> implements MyList<E> {
public static final int INITIAL_CAPACITY = 16;
private E[] data = (E[]) new Object[INITIAL_CAPACITY];
private int size = 0; // Number of elements in the list
/** Create an empty list */
public MyArrayList() {
}
/** Create a list from an array of objects */
public MyArrayList(E[] objects) {
for (int i = 0; i < objects.length; i++)
add(objects[i]); // Warning: don’t use super(objects)!
}
@Override /** Add a new element at the specified index */
public void add(int index, E e) {
// Ensure the index is in the right range
if (index < 0 || index > size)
throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
ensureCapacity();
// Move the elements to the right after the specified index
for (int i = size - 1; i >= index; i--)
data[i + 1] = data[i];
// Insert new element to data[index]
data[index] = e;
// Increase size by 1
size++;
}
/** Create a new larger array, double the current size + 1 */
private void ensureCapacity() {
if (size >= data.length) {
E[] newData = (E[]) (new Object[size * 2 + 1]);
System.arraycopy(data, 0, newData, 0, size);
data = newData;
}
}
@Override /** Clear the list */
public void clear() {
data = (E[]) new Object[INITIAL_CAPACITY];
size = 0;
}
@Override /** Return the element at the specified index */
public E get(int index) {
checkIndex(index);
return data[index];
}
private void checkIndex(int index) {
if (index < 0 || index >= size)
throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
}
@Override /** Return true if this list contains the element */
public boolean contains(Object e) {
for (int i = 0; i < size; i++)
if (e.equals(data[i]))
return true;
return false;
}
@Override /**
* Return the index of the first matching element in this list. Return -1 if no
* match.
*/
public int indexOf(Object e) {
for (int i = 0; i < size; i++)
if (e.equals(data[i]))
return i;
return -1;
}
@Override /**
* Return the index of the last matching element in this list. Return -1 if no
* match.
*/
public int lastIndexOf(E e) {
for (int i = size - 1; i >= 0; i--)
if (e.equals(data[i]))
return i;
return -1;
}
@Override /**
* Remove the element at the specified position in this list. Shift any
* subsequent elements to the left. Return the element that was removed from the
* list.
*/
public E remove(int index) {
checkIndex(index);
E e = data[index];
// Shift data to the left
for (int j = index; j < size - 1; j++)
data[j] = data[j + 1];
data[size - 1] = null; // This element is now null
// Decrement size
size--;
return e;
}
@Override /**
* Replace the element at the specified position in this list with the specified
* element.
*/
public E set(int index, E e) {
checkIndex(index);
E old = data[index];
data[index] = e;
return old;
}
@Override
public String toString() {
StringBuilder result = new StringBuilder("[");
for (int i = 0; i < size; i++) {
result.append(data[i]);
if (i < size - 1)
result.append(", ");
}
return result.toString() + "]";
}
/** Trims the capacity to current size */
public void trimToSize() {
if (size != data.length) {
E[] newData = (E[]) (new Object[size]);
System.arraycopy(data, 0, newData, 0, size);
data = newData;
} // If size == capacity, no need to trim
}
@Override /** Override iterator() defined in Iterable */
public java.util.Iterator<E> iterator() {
return new ArrayListIterator();
}
private class ArrayListIterator implements java.util.Iterator<E> {
private int current = 0; // Current index
@Override
public boolean hasNext() {
return current < size;
}
@Override
public E next() {
return data[current++];
}
@Override // Remove the element returned by the last next()
public void remove() {
if (current == 0) // next() has not been called yet
throw new IllegalStateException();
MyArrayList.this.remove(--current);
}
}
@Override /** Return the number of elements in this list */
public int size() {
return size;
}
}
interface MyList<E> extends Collection<E> {
/** Add a new element at the specified index in this list */
public void add(int index, E e);
/** Return the element from this list at the specified index */
public E get(int index);
/**
* Return the index of the first matching element in this list. Return -1 if no
* match.
*/
public int indexOf(Object e);
/**
* Return the index of the last matching element in this list Return -1 if no
* match.
*/
public int lastIndexOf(E e);
/**
* Remove the element at the specified position in this list Shift any
* subsequent elements to the left. Return the element that was removed from the
* list.
*/
public E remove(int index);
/**
* Replace the element at the specified position in this list with the specified
* element and returns the new set.
*/
public E set(int index, E e);
@Override
/** Add a new element at the end of this list */
public default boolean add(E e) {
add(size(), e);
return true;
}
@Override
/** Return true if this list contains no elements */
public default boolean isEmpty() {
return size() == 0;
}
@Override
/**
* Remove the first occurrence of the element e from this list. Shift any
* subsequent elements to the left. Return true if the element is removed.
*/
public default boolean remove(Object e) {
if (indexOf(e) >= 0) {
remove(indexOf(e));
return true;
} else
return false;
}
@Override
/**
* Adds the elements in otherList to this list. Returns true if this list
* changed as a result of the call
*/
public default boolean addAll(Collection<? extends E> c) {
boolean status = false;
for(E o : c) {
status = add(o) || status;
}
return status;
}
@Override /** Return true if this list contains the element */
public default boolean contains(Object o) {
if (indexOf((E) o) == -1)
return false;
return true;
}
@Override
/**
* Returns true if this collection contains all of the elements in the specified
* collection.
*/
public default boolean containsAll(Collection<?> c) {
for(Object o : c) {
if(!contains(o)) {
return false;
}
}
return true;
}
@Override
/**
* Removes all the elements in otherList from this list Returns true if this
* list changed as a result of the call
*/
public default boolean removeAll(Collection<?> c) {
boolean status = false;
for(Object o : c.toArray()) {
status = remove(o) || status;
}
return status;
}
@Override
/**
* Retains the elements in this list that are also in otherList Returns true if
* this list changed as a result of the call
*/
public default boolean retainAll(Collection<?> c) {
// Left as an exercise
boolean status = false;
for(Object o: this.toArray()) {
if(!c.contains(o)) {
status = remove(o) || status;
}
}
return status;
}
@Override
/** Returns an array containing all of the elements in this collection. */
public default Object[] toArray() {
Object[] temp = new Object[this.size()];
for (int i = 0; i < this.size(); i++)
temp[i] = (Object) (this.get(i));
if (size() > 0)
return (E[]) temp;
else
return null;
}
@Override
/** Returns an array containing all of the elements in this collection;
* the runtime type of the returned array is that of the specified array.
*/
public default <T> T[] toArray(T[] array) {
int i = 0;
for(E x: this) {
array[i++] = (T) x;
}
return array;
}
}
public class TestMyArrayList {
public static void main(String[] args) {
new TestMyArrayList();
}
public TestMyArrayList() {
String[] name1 = { "Tom", "George", "Peter", "Jean", "Jane" };
String[] name2 = { "George", "Michael", "Michelle", "Daniel" };
String[] name3 = { "Tom", "Peter" };
MyList<String> list1 = new MyArrayList<String>(name1);
MyList<String> list2 = new MyArrayList<String>(name2);
MyList<String> list3 = new MyArrayList<String>(name3);
System.out.println("list1:" + list1);
System.out.println("list2:" + list2);
System.out.println("list3:" + list3);
System.out.println("\n\nlist1 contains all of list3? " + list1.containsAll(list3));
System.out.println("\n\nlist2 contains all of list3? " + list2.containsAll(list3));
System.out.println("\n\nlist1 removed all of list3? " + list1.removeAll(list3));
System.out.println("list1:" + list1);
System.out.println("\n\nlist2 removed all of list3? " + list2.removeAll(list3));
System.out.println("list2:" + list2);
list1 = new MyArrayList<String>(name1);
list2 = new MyArrayList<String>(name2);
list3 = new MyArrayList<String>(name3);
System.out.println("\n\nlist1 retains all of list3? " + list1.retainAll(list3));
System.out.println("list1 After retainAll:" + list1 + "\n");
list1 = new MyArrayList<String>(name1);
list1.add("Bahram");
System.out.println("list1:" + list1);
System.out.println("list2:" + list2);
list1.addAll(list2);
System.out.println("After addAll:" + list1 + "\n");
Object[] nameArray1 = list1.toArray();
System.out.println(new ArrayList(Arrays.asList(nameArray1)));
String[] nameArray2 = new String[list1.size()];
nameArray2 = list1.toArray(nameArray2);
System.out.println(new ArrayList<String>(Arrays.asList(nameArray2)) + "\n");
}
}
************************************************** Thanks for your question. We try our best to help you with detailed answers, But in any case, if you need any modification or have a query/issue with respect to above answer, Please ask that in the comment section. We will surely try to address your query ASAP and resolve the issue.
Please consider providing a thumbs up to this question if it helps you. by Doing that, You will help other students, who are facing similar issue.