précédent | suivant | table des matières
|
|
Cette classe abstraite fournit une implémentation minimale de l’interface Collection en utilisant essentiellement les itérateurs.
public abstract class AbstractCollection<E> implements Collection<E> {
...
}
1 Le constructeur par défaut :
protected AbstractCollection(){
}
2 Les méthodes qui sont abstraites, ou non supportées :
public abstract Iterator<E> iterator();
public abstract int size();
La méthode optionnelle add est définie dans la classe AbstractCollection et lèvent une exception UnsupportedOperationException :
public boolean add(E o) {
throw new UnsupportedOperationException();
}
3 Les méthodes définies :
La méthode isEmpty() peut être définie en utilisant la méthode size() :
public boolean isEmpty() {
return size() == 0;
}
La méthode contains(Object o) retourne true si l’objet o appartient à la collection et false sinon :
public boolean contains(Object o){
Iterator<E> e = iterator();
if(o==null) {
while(e.hasNext())
if (e.next()==null) return true;
}else {
while (e.hasNext())
if (o.equals(e.next())) return true;
}
return false;
}
Les deux méthodes suivantes convertissent un vecteur en un tableau d’Object :
public Object[] toArray() {
Object[] result = newObject[size()];
Iterator<E> e = iterator();
for (int i=0; e.hasNext(); i++)
result[i] = e.next();
return result;
}
|
public Object[] toArray() {
Object[] result = new Object[size()];
int i = 0;
for (E x : this)
result[i++] = x;
return result;
}
|
La méthode suivante, copie tous les éléments du vecteur dans le tableau t et retourne ce tableau si celui-ci est assez grand, sinon elle copie les éléments dans un tableau qui est créé et le retourne.
public <T> T[] toArray(T[] a ) {
if (a.length < size())
a = (T[])java.lang.reflect.Array.newInstance(
a.getClass().getComponentType(), size());
Iterator<E> it = iterator();
for (int i = 0; i < size(); i++)
a[i] = it.next();
if (a.length > size())
a[size()] = null;
return a;
}
Les méthodes ayant en paramètre une collection sont définies de la façon suivante:
public booleancontainsAll(Collection<?> c) {
Iterator<E> e = c.iterator();
while (e.hasNext())
if(!contains(e.next()))
return false;
return true;
} |
public boolean containsAll(Collection<?> c) {
for(E x : c) if(!contains(x)) return false;
return true;
} |
public boolean addAll(Collection<? extends E> c ){
boolean modifie = false;
Iterator<E> e = c.iterator();
while (e.hasNext()) {
if(add(e.next())) modifie = true;
}
return modifie;
}
|
public boolean addAll(Collection<? extends E> c){
boolean modifie = false
for(E e : c)
if(add(e)) modifie = true;
return modifie;
}
|
public boolean removeAll(Collection<?> c) {
boolean modifie = false;
Iterator<E> e = iterator();
while (e.hasNext()) {
if(c.contains(e.next())){
e.remove();
modifie = true;
}
}
return modifie;
}
|
Pas d'équivalent aussi performant avec for. |
public boolean retainAll(Collection<?> c) {
boolean modifie = false;
Iterator<E> e = iterator();
while (e.hasNext()) {
if(!c.contains(e.next())) {
e.remove();
modifie = true;
}
}
return modifie;
} |
Pas d'équivalent aussi performant avec for. |
Les méthodes suivantes sont optionnelles parce que la méthode remove de Iterator est optionnelle, elles peuvent être définies en utilisant remove :
public void clear() {
Iterator<E> e = iterator();
while (e.hasNext()) {
e.next();
e.remove();
}
}
public boolean remove(Object o) {
Iterator<E> e = iterator();
if (o==null) {
while (e.hasNext()) {
if (e.next()==null){
e.remove();
return true;
}
}
}else{
while(e.hasNext()) {
if(o.equals(e.next())) {
e.remove();
return true;
}
}
}
return false;
}
La méthode toString peut aussi être définie dans la classe AbstractCollection :
public String toString() {
StringBuffer buf = new StringBuffer();
Iterator<E> e = iterator();
buf.append("[");
if( nbElements!=0 ){
buf.append(String.valueOf(e.next()));
for (int i = 1; i < size(); i++)
buf.append(","+String.valueOf(e.next()));
}
buf.append("]");
return buf.toString();
}