a
package com.codegym.task.task37.task3707;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.*;
public class AmigoSet<E> extends AbstractSet implements Set, Serializable, Cloneable {
private static final Object PRESENT = new Object();
private transient HashMap<E, Object> map;
public AmigoSet() {
this.map = new HashMap<>();
}
public AmigoSet(Collection<? extends E> collection) {
this.map = new HashMap<>(Math.max(16, (int) (Math.ceil(collection.size() / .75f))));
for(E e : collection) {
map.put(e, PRESENT);
}
}
@Override
public boolean isEmpty() {
return map.isEmpty();
}
@Override
public boolean contains(Object o) {
return map.containsKey(o);
}
@Override
public void clear() {
map.clear();
}
@Override
public boolean remove(Object o) {
if(map.containsKey(o)) {
map.remove(o);
return true;
} else {
return false;
}
}
@Override
public Iterator iterator() {
return map.keySet().iterator();
}
@Override
public int size() {
return map.size();
}
@Override
public boolean add(Object object) {
if(map.containsKey(object))
return false;
else
map.put((E) object, PRESENT);
return true;
}
@Override
public Object clone() {
try{
Object clone = super.clone();
Object temp = map.clone();
return clone;
}catch (Exception e) {
throw new InternalError(e);
}
}
private void writeObject(ObjectOutputStream outputStream) throws IOException {
outputStream.defaultWriteObject();
outputStream.writeObject(this);
outputStream.writeFloat(HashMapReflectionHelper.callHiddenMethod(map, "loadFactor()"));
outputStream.writeInt(HashMapReflectionHelper.callHiddenMethod(map, "capacity()"));
}
private void readObject(ObjectInputStream inputStream) throws IOException, ClassNotFoundException {
inputStream.defaultReadObject();
AmigoSet set = (AmigoSet) inputStream.readObject();
float loadFactor = inputStream.readFloat();
int capacity = inputStream.readInt();
HashMap<E, Object> map = new HashMap<>(capacity, loadFactor);
}
}