J'ai une classe appelée AuctionItem
. La classe AuctionItem
a une méthode appelée getName()
qui renvoie String
. Si j'ai une ArrayList
de type AuctionItem
, quel est le meilleur moyen de renvoyer l'index d'un élément de la ArrayList
portant un nom spécifique?
Je sais qu'il existe une fonction .indexOf()
. Le paramètre pour cette fonction est un objet. Pour trouver l'élément qui a un nom, devrais-je simplement utiliser une boucle for, et lorsque l'élément est trouvé, renvoyer la position de l'élément dans la variable ArrayList
?
Y a-t-il un meilleur moyen?
Je pense qu'une boucle for devrait être une solution valable:
public int getIndexByname(String pName)
{
for(AuctionItem _item : *yourArray*)
{
if(_item.getName().equals(pName))
return *yourarray*.indexOf(_item)
}
return -1;
}
Oui.vous devez le mettre en boucle
public int getIndex(String itemName)
{
for (int i = 0; i < arraylist.size(); i++)
{
AuctionItem auction = arraylist.get(i);
if (itemName.equals(auction.getname()))
{
return i;
}
}
return -1;
}
Fondamentalement, vous devez rechercher l'élément ArrayList
en fonction du nom getName
. Deux approches à ce problème:
1- N'utilisez pas ArrayList
, utilisez HashMap<String,AutionItem>
où String
serait name
2- Utilisez getName
pour générer un index et utiliser une addition basée sur un index dans la liste de tableaux list.add(int index, E element)
. Une façon de générer un index à partir de name serait d'utiliser son hashCode et son modulo par ArrayList
taille actuelle (quelque chose similaire à ce qui est utilisé dans HashMap
for (int i = 0; i < list.length; i++) {
if (list.get(i) .getName().equalsIgnoreCase("myName")) {
System.out.println(i);
break;
}
}
.indexOf () fonctionne bien . Si vous voulez un exemple en voici un:
ArrayList<String> example = new ArrayList<String>();
example.add("AB");
example.add("CD");
example.add("EF");
example.add("GH");
example.add("IJ");
example.add("KL");
example.add("MN");
System.out.println("Index of 'AB': "+example.indexOf("AB"));
System.out.println("Index of 'KL': "+example.indexOf("KL"));
System.out.println("Index of 'AA': "+example.indexOf("AA"));
System.out.println("Index of 'EF': "+example.indexOf("EF"));
vous donnera une sortie de
Index of 'AB': 0
Index of 'KL': 5
Index of 'AA': -1
Index of 'EF': 2
Remarque: Cette méthode retourne -1 si l'élément spécifié n'est pas présent dans la liste.
Pour trouver l'élément qui a un nom, devrais-je simplement utiliser une boucle for, et lorsque l'élément est trouvé, renvoyer la position de l'élément dans ArrayList?
Oui à la boucle (en utilisant des index ou une Iterator
). Sur la valeur de retour, renvoyez son index ou l'élément lui-même, en fonction de vos besoins. ArrayList
n'a pas indexOf
(Object target, Comparator compare) `ou similaire. Maintenant que Java reçoit les expressions lambda (dans Java 8, ~ mars 2014), je suppose que nous verrons les API obtenir des méthodes qui acceptent les lambdas pour des opérations de ce type.
Plutôt qu'une force brute parcourant la liste (par exemple, de 1 à 10000), utilisez plutôt une approche de recherche itérative: La liste doit être triée en fonction de l'élément à tester.
Commencez la recherche à la taille d'élément médiane ()/2, par exemple 5000 Si l'élément recherché est supérieur à l'élément à 5000, puis testez l'élément au point médian compris entre le point haut (10000) et le point milieu (5000) - 7500
continuez ainsi jusqu'à ce que vous atteigniez le match (ou utilisez une boucle de force brute lorsque vous atteignez une plage plus petite (par exemple, 20 objets)
Vous pouvez rechercher une liste de 10000 dans environ 13 à 14 tests, plutôt que potentiellement 9999 tests.
Vous pouvez implémenter hashCode
/equals
de votre AuctionItem
afin que deux d'entre elles soient égales si elles portent le même nom. Lorsque vous faites cela, vous pouvez utiliser les méthodes indexOf
et contains
de ArrayList
comme ceci: arrayList.indexOf(new AuctionItem("The name"))
. Ou lorsque vous supposez dans la méthode equals qu'une chaîne est passée: arrayList.indexOf("The name")
. Mais ce n'est pas la meilleure conception.
Mais je préférerais également utiliser un HashMap
pour mapper le nom de l'élément.