2017-02-22 3 views
0

Ich habe viel gesucht, und überprüft die Beiträge, die als mögliche Antworten zur Verfügung gestellt wird, und keine scheint mir eine Antwort zu geben.So entfernen Sie ein Objekt in einer Array-Liste

Ich habe diese Arraylist in denen ich Online-Benutzer speichern. Ich kann aus der Benutzerliste lesen und hinzufügen. Problem ist, ich kann nicht herausfinden, wie ich es entfernen.

I

online.remove("MyUsername"); 

Meine Klasse versucht haben und initialiser ist wie folgt:

ArrayList<userOnline> online = new ArrayList<userOnline>(); 

    class userOnline { 
     String userName; 
     String data1; 
     String data2; 
     String data3; 
    } 

ich es dachte, das Objekt Zeile mit Benutzername finden würde und die Zeile, oder zumindest den Benutzernamen entfernen, aber es hat nichts entfernt und gibt mir keine Fehler.

Was kann ich tun, damit es funktioniert? Oder was kann ich als Alternative verwenden, wenn das nicht möglich ist? Ein Zeiger auf ein Dokument zur Erklärung wäre mehr als genug Hilfe!

Danke!

Schienen die Lösung war, aber das ist nicht als gute Praxis

for (int i=0; i <online.size(); i++) { 
    if(online.get(i).userName.equals("username")) { 
     online.remove(i); 
    } 
} 

Nach einer Diskussion und eine Menge Feedback scheint, wie der einzig richtige Weg für Java diese Suche zu handhaben und entfernen ist,

+1

Sie müssen Definieren Sie equals() für die userOnline-Klasse, um das Objekt lokalisieren und entfernen zu können. –

+0

Sie können entweder mit dem Index des Elements entfernen oder mit dem Objekt –

+0

des Elements entfernen, aber machen 'equals()' nicht wahr für einen String – Bohemian

Antwort

2

Grundsätzlich kann man nicht Äpfel und Birnen (String und userOnline) direkt vergleichen. Ja, Sie könnten equals überschreiben, aber es sollte wirklich alle Eigenschaften erfüllen, nicht nur eine.

Eine einfache Lösung wäre es, die List zu suchen, Vergleichen jedes Objekte userName Eigenschaft mit dem Wert, den Sie den index oder Objektreferenz ein entweder zurückgeben möchten, was Sie es entfernen benutzen konnten.

Alternativ können Sie eine Iterator und entfernen Sie sie verwenden, wie Sie suchen ...

ArrayList<userOnline> online = new ArrayList<>(); 
userOnline newUser = new userOnline(); 
newUser.userName = "MyUsername"; 
online.add(newUser); 
System.out.println(online.size()); 
Iterator<userOnline> it = online.iterator(); 
while (it.hasNext()) { 
    userOnline user = it.next(); 
    if ("MyUsername".equals(user.userName)) { 
     it.remove(); 
    } 
} 
System.out.println(online.size()); 

Wahrscheinlich gibt es auch ein wirklich cool „Streams“ basierte Lösung, aber kleine Schritte;)

0

Ihr Code fragt, um eine Zeichenfolge aus einer Liste von UserOnlines zu entfernen, Sie müssen die Objektreferenz für die Methode remove (Object o) verwenden, oder Sie müssen den Index des gewünschten Objekts herausfinden Entfernen Sie und verwenden Sie die Methode remove (int index). Wie fügen Sie Ihre Objekte zur Liste hinzu? Wenn Sie die Liste selbst als Referenz verwenden, müssen Sie eine eigene Methode erstellen, um zu definieren, welches Objekt "MyUserName" sein soll.

+0

Ok, ich erstelle eine neue userOnline(); und lege die Variablen dem neuen Benutzer und ich füge neue Benutzer der Arraylist hinzu. –

+0

Wenn Sie etwas wie folgt tun: UserOnline myUser = new UserOnline() dann können Sie einfach list.remove (myUser) tun. Wenn Sie jedoch list.add (new UserOnline()) wie andere erwähnt haben, müssen Sie definieren, wie Ihr Programm das gewünschte Objekt findet. Es gab ein paar Vorschläge, um Ihr Namensfeld zu betrachten, wenn Sie das verwenden möchten. –

2

Sie könnten eine Funktion erstellen, die in Ihrer Liste der Nutzer entsprechen und findet das erste Vorkommen eines bestimmten Namen und entfernt sie, wenn sie einen Benutzer mit dem Namen wie so

public Array<userOnline> removeUserByName(Array<userOnline> users, String nameToFind) 
{ 
    for(int i = 0; i < users.size(); i++) 
    { 
     if(users.get(i).userName.equals(nameToFind)) 
     { 
      users.remove(i); 
      return users; 
     } 
    } 
    return users; 
} 

Sie auch machen könnten gegeben finden Diese Funktion Teil der Klasse speichern Sie Ihre Liste der userOnline Objekte dann müssten Sie nicht das Array in die Funktion übergeben.

5

ich kein Betrogene oder einen geeigneten doc finden konnte, so ist es hier:

Verwenden Sie ein Iterator:

for (Iterator<userOnline> iterator = online.iterator(); iterator.hasNext();) { 
    if (iterator.next().getName().equals("MyUsername")) { 
     iterator.remove(); 
    } 
} 
+0

Dies wird alle Objekte mit "MyUsername" in jedem der Online-Arrays entfernen/suchen, richtig? Also ist es gut für eine Suche usw.? –

2

Iterate über die Liste den Index des Elements finden Sie interessiert sind, in:

int idx = -1; 
    for (int i = 0; i < online.size(); i++) { 
     if(online.get(i).userName.equals("MyUsername")) 
     { 
      idx = i; 
     } 
    } 

Verwenden dieser Index das entsprechende Element zu entfernen:

if(idx != -1) { 
    online.remove(online[idx]); 
} 

Dies würde nur das erste Vorkommen entfernen. Sie könnten diesen Code in eine Funktion einfügen und wiederholt aufrufen, um alle Vorkommen zu finden.

+0

@MadProgrammer Danke. Mehrere verschiedene Programmiersprachen wurden heute verwendet. – sgrg

+0

Ja, erzähl mir davon: P – MadProgrammer

+0

@sgrg, könntest du den Unterschied zwischen der Antwort erklären, die ich in meinem Beitrag und dieser hinzugefügt habe? –

2

Sie müssen die userOnline-Objekte durchsuchen, die in Ihrer ArrayList enthalten sind, und entweder den Index der Übereinstimmung oder einen Verweis auf die Übereinstimmung finden. Sobald Sie eine dieser Möglichkeiten haben, können Sie das Objekt mit einer der überladenen remove() Methoden aus der Liste entfernen. Beachten Sie, dass die equals-Methode standardmäßig Verweise vergleicht.

Die Suche kann wie folgt sein:

private userOnline findUserOnlineWithUsername(String username) { 
    Iterator<userOnline> it = online.iterator(); 
    onlineUser olu = null; 

    while(it.hasNext()) { 
     olu = it.next(); 
     if (olu.userName.equals(username)) { return olu;} 
    } 

    return null; 
} 
Verwandte Themen