Si j'ai une liste contenant [alice, bob, abigail, charlie]
et que je veux écrire un itérateur tel qu'il itère sur les éléments commençant par 'a', puis-je écrire le mien? Comment puis je faire ça ?
Réponses
Trop de publicités?Le meilleur réutilisables option que vous obtenez est de mettre en œuvre l'interface Itérable et remplacer la méthode getIterator()... Voici un exemple d'un tableau de la liste de classe implémentant l'interface, ce qui vous permettrait de remplacer la méthode Iterator().
import java.util.Iterator;
public class SOList<Type> implements Iterable<Type> {
private Type[] arrayList;
private int currentSize;
public SOList(Type[] newArray) {
this.arrayList = newArray;
this.currentSize = arrayList.length;
}
@Override
public Iterator<Type> iterator() {
Iterator<Type> it = new Iterator<Type>() {
private int currentIndex = 0;
@Override
public boolean hasNext() {
return currentIndex < currentSize && arrayList[currentIndex] != null;
}
@Override
public Type next() {
return arrayList[currentIndex++];
}
@Override
public void remove() {
// TODO Auto-generated method stub
}
};
return it;
}
}
Cette classe implémente l'objet iterable interface à l'aide de médicaments Génériques. Considérant que vous avez les éléments de la matrice, vous serez en mesure d'obtenir une instance d'un Itérateur, qui est le besoin de l'instance utilisé par le "foreach" en boucle, par exemple.
Il vous suffit de créer une instance anonyme de l'itérateur sans créer l'extension d'Itérateur et de profiter de la valeur de currentSize pour vérifier jusqu'à l'endroit où vous pouvez naviguer sur le tableau (disons que vous avez créé un tableau avec une capacité de 10, mais vous n'avez que 2 éléments 0 et 1). L'instance va avoir son propriétaire comptoir d'où il est et tout ce que vous devez faire est de jouer avec hasNext () qui vérifie si la valeur n'est pas null, et le suivant(), qui renvoie à l'exemple de votre currentIndex. Ci-dessous un exemple d'utilisation de cette API...
public static void main(String[] args) {
// create an array of type Integer
Integer[] numbers = new Integer[]{1, 2, 3, 4, 5};
// create your list and hold the values.
SOList<Integer> stackOverflowList = new SOList<Integer>(numbers);
// Since our class SOList is an instance of Iterable, then we can use it on a foreach loop
for(Integer num : stackOverflowList) {
System.out.print(num);
}
// creating an array of Strings
String[] languages = new String[]{"C", "C++", "Java", "Python", "Scala"};
// create your list and hold the values using the same list implementation.
SOList<String> languagesList = new SOList<String>(languages);
System.out.println("");
// Since our class SOList is an instance of Iterable, then we can use it on a foreach loop
for(String lang : languagesList) {
System.out.println(lang);
}
}
// will print "12345
//C
//C++
//Java
//Python
//Scala
Si vous le souhaitez, vous pouvez parcourir aussi bien à l'aide de l'Itérateur exemple:
// navigating the iterator
while (allNumbers.hasNext()) {
Integer value = allNumbers.next();
if (allNumbers.hasNext()) {
System.out.print(value + ", ");
} else {
System.out.print(value);
}
}
// will print 1, 2, 3, 4, 5
Le foreach de documentation est situé au http://download.oracle.com/javase/1,5.0/docs/guide/language/foreach.html. Vous pouvez prendre un coup d'oeil à une implémentation plus complète à ma pratique personnelle de google code.
Maintenant, pour obtenir les effets de ce que vous avez besoin, je pense que vous avez besoin de brancher un concept de filtre dans l'Itérateur... Depuis l'itérateur dépend du côté des valeurs, il serait difficile de retourner la valeur true sur hasNext(), puis filtrer la méthode next() de la mise en œuvre avec une valeur qui ne commence pas par un caractère "a" par exemple. Je pense que vous devez jouer avec un secondaire Interator basé sur une liste filtrée avec les valeurs avec le filtre donné.
Assurez-vous. Un itérateur est juste de la mise en œuvre de l' java.util.Iterator
interface. Si vous utilisez un existant objet itérable (disons, une LinkedList
) à partir de java.util
, vous aurez besoin soit de la sous-classe et de remplacer son iterator
fonction de sorte que vous renvoyer votre propre, ou fournir un moyen de emballage standard d'itérateur dans votre spécial Iterator
instance (qui a l'avantage d'être plus largement utilisé), etc.
Vous pouvez implémenter votre propre itérateur. Votre itérateur peut être construit pour encapsuler l'itérateur renvoyé par la liste ou vous pouvez conserver un curseur et utiliser la méthode get de la liste (int index). Il vous suffit d'ajouter une logique à la prochaine méthode de votre itérateur ET à la méthode hasNext pour prendre en compte vos critères de filtrage. Vous devrez également décider si votre itérateur prendra en charge l'opération de suppression.