web-dev-qa-db-fra.com

Obtention de l'index d'un article dans une liste;

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? 

14
user2351151

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;
    }
15
Kooki

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;
}
14
Suresh Atta

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>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

5
harsh
for (int i = 0; i < list.length; i++) {
   if (list.get(i) .getName().equalsIgnoreCase("myName")) {
    System.out.println(i);
    break;
  }
}
2
Deepak

.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.

1
Ritwik Gupta

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.

0
T.J. Crowder

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.

0
Moosee

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.

0
Kai