[Minecraft] Wie kann ich mit HashMap folgendes ausgeben lassen?
Vorab: Mir erzählte man, man brauche in der HashMap<String, ArrayList>.
Es gibt einen Command: /loc <world> <name>
Dadraus soll
/loc world end, /loc nether portal und /loc end portal
entstehen. Wie ich args.length == 1 oder args.length == 2 jetzt anwende, weiß ich. Aber da wird ja beim eingeben vom 1. & 2. Wert immer nur der 2. Wert ausgegeben.
2 Antworten
Hab jetzt deine Frage absolut nicht im geringsten verstanden, aber
Aber da wird ja beim eingeben vom 1. & 2. Wert immer nur der 2. Wert ausgegeben.
kann es sein, dass du nicht weißt, dass eine ArrayList mit 0 und nicht mit 1 anfängt? Wie gesagt hab deine Frage nicht gecheckt.
Ich habe die gleiche Frage jemanden im Discord gestellt und er wusste sofort was ich meine...
Auch nach dreimaligem durchlesen deiner Frage checke ich nicht was du tun willst.
Wenn du einfach die Argumente abfragen willst, fragst du erst nach der Länge ab mit
args#length
und dann fragst du halt die einzelnen Argumente ab also
args[0], args[1] usw.
Wenn du also bitte nocheinmal erklären würdest was du willst, könnte ich dir auch helfen.
OK tut mir Leid, ich bin schon den ganzen Tag etwas verwirrt.
Ich schick den Code hier einmal rein und versuche es nochmal zu erklären xD
@Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
Player p = (Player) sender;
if (cmd.getName().equalsIgnoreCase("loc")) {
if (sender instanceof Player) {
if (PermissionsEx.getUser(p).inGroup("Owner") || PermissionsEx.getUser(p).inGroup("Vice")) {
if (args.length == 1) {
if (args[0].equalsIgnoreCase("world")) {
p.sendMessage("§l§7[§aAltes Zuahuse§7]\n§fX:§7-1015 §fY:§764 §fZ:§7-387");
} else if (args[0].equalsIgnoreCase("nhome")) {
p.sendMessage("§l§7[§aNeues Zuahuse§7]\n§fX:§7 -3244 §fY:§768 §fZ:§7-3394");
} else if (args[0].equalsIgnoreCase("end")) {
p.sendMessage("§l§7[§5Endportal§7]\n§fX:§7 -1061 §fY:§768 §fZ:§7-13");
} else if (args[0].equalsIgnoreCase("other")) {
p.sendMessage("§cNicht verfügbar");
} else {
p.sendMessage("§bBenutze: §f/loc §a<ohome, nhome, end, other>");
}
} else if (args.length == 2) {
if (args[1].equalsIgnoreCase("deinemama")) {
p.sendMessage("funzt");
}
} else if (args.length == 0 || args.length == 3) {
p.sendMessage("§bBenutze: §f/loc §a<ohome, nhome, end, other>");
}
} else {
p.sendMessage(main.noperm);
}
} else {
Bukkit.getServer().getConsoleSender().sendMessage("§cDu musst ein Spieler sein!");
}
}
return false;
}
Es passiert Folgendes:
man kann /loc <bla> <bla> machen. Jedoch will ich aber, dass der 2. Wert nur genutzt werden kann, wenn der 1. Wert beispielsweise "world" ist.
Also ich darf nur
/loc world end
/loc world ANDERES //falls was dazu kommt
/loc nether portal
/loc nether ANDERES //falls was dazu kommt
/loc end portal
/loc end ANDERES //falls was dazu kommt
Also der 1. Wert ist für die Welt bestimmt, für die die Locations gespeichert sind. Der 2. Wert ist unterschiedlich zu dem 1. Wert. Weil wenn ich zum Beispiel /loc world portal und /loc nether portal habe, soll für den jeweiligen Command etwas anderes kommen. Ich hoffe, jetzt kann man es verstehen. Ich wüsste jetzt auch nicht, wie ich es besser erklären soll xD 😅
Du machst einfach zwei geschachtelte If abfragen.
Einmal für die Welt
if(args[0].equalsignorecase("world")) { //hier fragst du die Welt ab
if(args[1].equalsignorecase("portal") { //hier fragst du den Ort in der Welt ab
//Führ aus was du willst
if(args[0].equalsignorecase("nether")) { //hier fragst du die Welt ab
if(args[1].equalsignorecase("portal") { //hier fragst du den Ort in der Welt ab
//Blablaa
Das machst du einfach für jeden Ort und jede Welt. Es gibt sicher einen besseren Weg, aber mir fällt um die Zeit keiner ein.
Das hatte ich auch schonmal versucht, aber anscheinend habe ich nen Fehler gehabt. Ich probier es einfach nochmal. Schließlich funktionierte etwas mal, nur weil ich es nochmal von vorne geschrieben habe lol
Ich denke dir! Ich habe mal wieder 1&2 vertauscht und alles neu geschrieben. Und schwups.. es funktioniert. Jetzt noch ein paar Feinheiten machen😁
Es gibe verschiedene Arten von Maps. HashMap ist eine davon. Prinzipiell funktionieen die alle gleich.
Und zwar kannst du da drin Key/Value-Paare speichern:
HashMap<String, String> hashMap = new HashMap<>();
hashMap.put("farbe", "rot");
hashMap.put("form", "eckig");
Anmerkung: "farbe" und "form" sind die Keys. "rot" und "eckig" sind die damit verknüpften Values.
und auch wieder abrufen:
System.out.println(hashMap.get("farbe")); //="rot"
Dabei müssen sowohl für den Key als auch Value nicht zwingend Strings sein. Es kann auch Integer oder irgendeine andere Klasse sein. Je nachdem, was du brauchst. Was jeweils verwendet wird, gibst du in den eckigen Klammern an.
Wenn es bei deinem /loc darum geht, den zweiten Parameter mit dem ersten zu verknüpfen, ist HashMap vllt das richtige (wir kennen die Umstände drumherum nicht). Aber nicht als <String, ArrayList>, da beide Befehlsparameter Strings sind. Also <String, String>
In dem Fall dort, wo der eingegebene Befehl geparst (eingelesen) wird, also:
hashMap.put(parameter1, parameter2);
Und dann beim Abrufen an anderer Stelle im Code z.B.:
hashMap.get("world") //gibt dir nach Eingabe deiner 3 Befehle "end" zurück
Die HashMap selbst solltest du als Instanzvariable in der Klasse deklarieren, wo das ganze passiert, und im Konstruktor initialisieren, dmait sie auch zur Verfügung steht.
Aber Vorsicht:
Vor dem Verarbeiten des Befehls musst du den Befehl auf korrekte Eingabe prüfen:
- Sind beide Parameter angegeben worden?
- Sind beide Parameter gültig?
Wenn beides ja: In der HahMap speichern, wenn fehlerhaft: Fehlermeldung zum User und nichts speichern.
Und beim Wiederabrufen mit hashMap.get mit null als Rückgabe rechnen, falls zuvor noch nicht mit dem /loc-Befehl dem jeweilige Key ein Value zurückgegeben wurde.
Im Fall von ungültig oder null musst du dann entsprechend reagieren. Entweder den Vorgang abbrechen und Meldung zum User, dass nichts da ist, oder den Vorgang mit einem Standardwert fortsetzen (je nachdem, was in deinem Fall geeignet ist).
Ebenfalls musst beim Abrufen erneut überprüfen, ob der Value immer noch gültig ist (das kann sich zwischenzeitig geändert haben!).
Ich weiß, dass sie mit 0 Anfängt, deswegen habe ich im Code auch noch
drin...