it-swarm.com.de

Index eines Elements in einer Arrayliste abrufen;

Ich habe eine Klasse namens AuctionItem. Die AuctionItem-Klasse hat eine Methode namens getName(), die eine String zurückgibt. Wenn ich eine ArrayList vom Typ AuctionItem habe, was ist der beste Weg, um den Index eines Elements in der ArrayList zurückzugeben, das einen bestimmten Namen hat?

Ich weiß, dass es eine .indexOf()-Funktion gibt. Der Parameter für diese Funktion ist ein Objekt. Soll ich das Element finden, das einen Namen hat, sollte ich einfach eine for-Schleife verwenden. Wenn das Element gefunden wurde, geben Sie die Elementposition in der Variable ArrayList zurück.

Gibt es einen besseren Weg? 

14
user2351151

Ich denke, eine for-Schleife sollte eine gültige Lösung sein:

    public int getIndexByname(String pName)
    {
        for(AuctionItem _item : *yourArray*)
        {
            if(_item.getName().equals(pName))
                return *yourarray*.indexOf(_item)
        }
        return -1;
    }
15
Kooki

Ja. Du musst es schleifen

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

Grundsätzlich müssen Sie das ArrayList-Element anhand des Namens getName suchen. Zwei Ansätze für dieses Problem:

1- Verwenden Sie nicht ArrayList, verwenden Sie HashMap<String,AutionItem>, wobei String name wäre

2- Verwenden Sie getName, um einen Index zu generieren, und verwenden Sie einen indexbasierten Zusatz in der Array-Liste list.add(int index, E element). Eine Möglichkeit, einen Index aus dem Namen zu generieren, besteht darin, den Hashcode und den Modulo anhand der aktuellen Größe von ArrayList zu verwenden (etwas Ähnliches, was in HashMap verwendet wird).

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 () funktioniert gut ..__ Wenn Sie ein Beispiel möchten, ist hier eines:

  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"));

gibt Ihnen eine Ausgabe von

Index of 'AB': 0
Index of 'KL': 5
Index of 'AA': -1
Index of 'EF': 2

Anmerkung: Diese Methode gibt -1 zurück, wenn das angegebene Element nicht in der Liste vorhanden ist.

1
Ritwik Gupta

Soll ich das Element finden, das einen Namen hat, sollte ich einfach eine for-Schleife verwenden. Wenn das Element gefunden wurde, die Elementposition in der ArrayList zurückgeben?

Ja zur Schleife (entweder mit Indizes oder einer Iterator). Geben Sie für den Rückgabewert entweder seinen Index oder den Artikel selbst zurück, je nach Ihren Anforderungen. ArrayList hat keine indexOf (Objektziel, Comparator compare) oder ähnliches. Nun, da Java Lambda-Ausdrücke erhält (in Java 8, ~ März 2014), erwarte ich, dass APIs Methoden erhalten, die für solche Dinge Lambdas akzeptieren.

0
T.J. Crowder

Verwenden Sie statt einer Brute-Force-Schleife durch die Liste (z. B. 1 bis 10000) einen iterativen Suchansatz: Die Liste muss nach dem zu testenden Element sortiert werden.

Starten Sie die Suche mit der mittleren Elementgröße ()/2, z. B. 5000 Wenn das Suchelement bei 5000 größer als das Element ist, testen Sie das Element im Mittelpunkt zwischen dem oberen (10000) und dem mittleren Punkt (5000) - 7500

machen Sie dies so lange, bis Sie das Spiel erreicht haben (oder verwenden Sie eine rohe Kraftschleife, wenn Sie einen kleineren Bereich erreichen (z. B. 20 Gegenstände).

Sie können eine Liste von 10000 in etwa 13 bis 14 Tests anstelle von potenziellen 9999 Tests suchen.

0
Moosee

Sie könnten hashCode/equals Ihrer AuctionItem implementieren, so dass zwei von ihnen gleich sind, wenn sie denselben Namen haben. Wenn Sie dies tun, können Sie die Methoden indexOf und contains der ArrayList wie folgt verwenden: arrayList.indexOf(new AuctionItem("The name")). Oder wenn Sie in der equals-Methode davon ausgehen, dass ein String übergeben wird: arrayList.indexOf("The name"). Aber das ist nicht das beste Design.

Ich würde aber auch lieber eine HashMap verwenden, um den Namen dem Artikel zuzuordnen.

0
Kai