Prüfen, ob Objekt in der ArrayList in Java
Habe ich die folgende Liste der Objekte:
private List<Object> teamlist = new ArrayList<Object>();
Und ich bin hinzufügen von Objekten zur Liste etwa so:
teamlist.add(new MCWarTeam(args[0], joinkey));
Nun die Objekte in der Liste keine Namen haben, kann aber verwiesen werden, indem der Liste, richtig? Bevor ich das hinzufügen eines neuen Elements zu der Liste, wie kann ich überprüfen, ob ein Objekt mit einem bestimmten Attribut bereits vorhanden ist? Dies ist der Konstruktor der Objekte:
public MCWarTeam(String teamname, String joinkey){
this.teamname = teamname;
this.joinkey = joinkey;
}
Möchte ich prüfen, ob es schon ein team mit dem Namen Teamnamen. Alternativ gibt es eine bessere Möglichkeit, um zu speichern die Objekte? Vor, ich habe gerade verwendet eine HashMap, fügen Sie den Teamnamen und joinkey und es hat Prima funktioniert, aber dachte, die Verwendung von Objekten statt dessen wäre ein besserer Weg, es zu tun.
Hier ist der wichtige code für die Ereignisprozedur:
else if (cmd.getName().equalsIgnoreCase("createTeam")) {
if (args.length > 0 && args.length < 3) {
String joinkey = "";
if (args.length > 1)
joinkey = args[1];
String teamname = args[0];
MCWarTeam newTeam = new MCWarTeam(teamname, joinkey);
if (!teamlist.containsKey(teamname)) {
teamlist.put(teamname, newTeam);
sender.sendMessage("Created new team \"" + teamname + "\" with join key \"" + joinkey + "\" successfully! Teams:");
sender.sendMessage("All teams:");
for (String key : teamlist.keySet()) {
sender.sendMessage(key);
}
} else
sender.sendMessage("Team already exists!");
return true;
}
return false;
}
else if (cmd.getName().equalsIgnoreCase("joinTeam")) {
if (args.length > 0 && args.length < 3) {
String joinkey = "";
if (args.length > 1)
joinkey = args[1];
String teamname = args[0];
if (teamlist.containsKey(teamname)) {
String teamKey = teamlist.get(teamname).getJoinKey();
if (joinkey == teamKey) {
teamlist.get(teamname).addPlayer(playername);
Bukkit.broadcastMessage("MCWar: " + playername + " joined Team \"" + teamname + "\" successfully!");
} else
sender.sendMessage("Join key incorrect!");
} else {
sender.sendMessage("Team doesn't exist! Teams:");
for (String key : teamlist.keySet()) {
sender.sendMessage(key);
}
}
return true;
}
return false;
}
Grundsätzlich, wenn Sie false zurückgibt, bekommt der Benutzer eine Meldung dass die korrekte Verwendung von dem Befehl, den er betrat.
equals
im MCWarTeam? Wenn dem so ist, verwenden Sie einfach List.contains
.Sie wollen wahrscheinlich geben Sie die Liste, um
<MCWarTeam>
statt <Object>
als gut. Auch ich weiß nicht, wie Sie dachte, dass ein ArrayList
ist irgendwie von Natur aus besser als ein HashMap
, aber ich hoffe, Sie basiert, auf etwas wirkliches und nicht nur ein Bauchgefühl.Ist es so schwer zu Lesen Sie die Spezifikation?
InformationsquelleAutor Martin Hoffmann | 2015-10-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Basiert auf der Beschreibung und deine Kommentare zu anderen Antworten, es scheint wie eine gute Idee, nicht mit einem
List
, sondern speichern Ihre Daten in einerMap<String, MCWarTeam>
, welche Karten die team-Namen inMCWarTeam
Objekte:Können Sie ein team, die Prüfung, ob ein team mit dem gleichen Namen bereits vorhanden ist, wie dieses:
Abrufen einer
MCWarTeam
- Objekt basierend auf team-Namen, z.B. für den Zugriff auf diejoinKey
Attribut, ist einfach:Beachten Sie, dass dieser Ansatz, Sie nicht implementieren sollte
equals
oderhashCode
imMCWarTeam
, weil Sie sind nicht gonna es brauchen; als Ihre map-keys sind die team-Namen,containsKey
arbeitet aufString
Objekte, die bereits gut definiertequals
undhashCode
Semantik.Ich bin immer ein komischen Fehler hier. In einer Funktion, die ich hinzufügen, dass teams mit
teamlist.put(teamname, newTeam);
. Jetzt jedes mal, wenn ich überprüfen, ob ein Eintrag vorhanden ist, überteamlist.containsKey(teamname)
, wird es als leer angezeigt. Keine Ergebnisse angezeigt, wenn ich es laufen lassen durch eine Schleife, aber wenn ich das exakt gleiche Schleife, nachdem ein element hinzufügen, werden alle hinzugefügten Elemente angezeigt. EDIT: das ist wenn ich call /createteam und /jointeam nach jedem anderen prntscr.com/8vpdnkEs ist schwer zu sagen, was passiert dort, ohne zu sehen den code. Konnte Sie Bearbeiten Ihre Frage und poste den code, wo du teams hinzufügen / check für Einträge?
Ich habe, Dank. Die HashMap teamlist ist oben definiert.
Eine Sache, die ich bemerkt ist, dass Sie Vergleich der join key
String
s mit==
; Sie verwenden solltenequals
statt. Sie könnten versuchen Sie den Vergleich zujoinkey.equals(teamKey)
und sehen, ob es hat keine Wirkung. Andere als die, es ist immer noch schwer zu sagen, was Ihre eigentliche problem ist. Ich bin nicht vertraut mit Bukkit oder Ihre event-handling framework, aber es könnte auch einige zeitliche Aspekte spielen hier eine Rolle, wenn die Ereignisse behandelt werden asyncronously. Posting mehr code helfen, verfolgen, das problem nach unten. Auch, bitte verwenden Sie geschweifte Klammern ({ }
) in allenif
s undelse
s (auch diejenigen, die mit einer einzelnen Anweisung).InformationsquelleAutor Mick Mnemonic
Java
List<T>
hat eineboolean contains(Objekt)
Methode, die praktisch für Situationen, wenn Sie wollen, um Duplikate zu vermeiden:MCWarTeam
Klasse implementieren mussequals
um für diese zu arbeiten. Wenn Sie überschreibenequals
müssen Sie auch überschreibenhashCode
.Wenn
joinkey
ist nicht Teil des Objekt-ist-Zustand, die Einflüsse der Geschlechter ist es in der Regel nicht eine gute Idee, um es als Teil des Objekts als Feld. Zum Beispiel, wennjoinkey
ist etwas, das vorübergehende, die Sie verwenden, um die "connect" - teams auf andere Dinge, so dass eineHashMap<String,MCWarTeam>
mitjoinkey
als Schlüssel für die Karte, und entfernenjoinkey
ausMCWarTeam
sollte eine gute Idee sein.MCWarTeam other = (MCWarTeam)obj; return teamname.equals(other.teamname);
arbeitet, um zu sehen, ob es bereits ein Objekt mit dem gleichen Namen in der Liste?Methodenaufrufe
equals(Object)
Methode unter der Haube, VergleichnewTeam
zu dem, was schon auf der Liste.wie bekomme ich den String
joinkey
aus einerteamname
? Ich habe versucht, die folgenden:String teamKey = teamlist.get(teamlist.indexOf(teamname)).getJoinKey();
und versucht, mit einer test MCWar-Objekt mit demselben Namen im Ort derteamname
imindexOf()
, aber das hat nicht funktioniert, muss ich @ÜberschreibenindexOf()
?InformationsquelleAutor dasblinkenlight
Um die Suche nach einem
MCWarTeam
Instanz in der ArrayList, Sie werden zunächst zu überschreibenequals
um zu definieren, was es bedeutet, für zweiMCWarTeam
Instanzen zu einander gleich. Dann können SieindexOf(team)
odercontains
um zu bestimmen, ob eine Instanz ist in derList
.Allerdings, so eine Suche dauern würde, die lineare Zeit, so ein
HashSet
kann besser für Ihre Bedürfnisse (zu diesem Zweck müssen Sie überschreiben sowohlequals
undhashCode
, und Sie werden in der Lage sein zu finden, wenn sich ein Objekt imSet
in konstanter Zeit).InformationsquelleAutor Eran
Wenn Sie implementieren
MCWarTeam
equals
Methode richtig, danncontains
sollte Ihnen sagen, wenn das Objekt vorhanden ist.Und wie @Eran erwähnt
HashSet
würde IhnenO(1)
lookup, wolist contains
istO(n)
, die einzige Sache ist, dassHashSet
erlaubt keine Duplikate.Und ja, die eigentliche Art, anstatt
Object
Set
kann unpraktisch sein für die OP, denn obwohlcontains
gut führt, der einzige Weg, um abrufen - Elemente ist durch iteration; es gibt keineget
Methode. EinMap<String,MCWarTeam>
vielleicht die beste alternative aus diesem Grund.InformationsquelleAutor Sleiman Jneidi