所以我正在为 Minecraft 服务器制作一个插件,我必须将我的命令命令参数从一个类传递到另一个类,在尝试了多种方法之后,我开始使用 ArrayList,它在大部分情况下都有效,但它用括号括起来 论据。
ArrayList<String> target = Main.target;
@EventHandler
public void invClickEvent(InventoryClickEvent e) {
Inventory inv = e.getInventory();
Player player = (Player) e.getWhoClicked();
String name = inv.getName();
if ( name.equals(ChatColor.RED + "Ban Menu")) {
e.setCancelled(true);
int slot = e.getSlot();
if (slot < 0) return;
if (slot == 0) {
player.performCommand("kill " + target);
player.closeInventory();
return;
}
}
}
这就是给我带来麻烦的代码。它正在从我的主类中提取数据。 ArrayList 正在从参数中提取文本。
public static ArrayList<String> target = new ArrayList<String>();
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
if (sender instanceof Player && args.length == 1) {
Player p = (Player) sender;
if (args.length > 0) {
switch (args.length) {
case 1:
Player player = Bukkit.getPlayer(args[0]);
if (player == null) {
sender.sendMessage("That player is not online");
} else if (player.isOnline()) {
Menus.openMenu(p);
target.add(player.getPlayerListName());
}
}
}
}
}
这就是数组拉动参数的地方。输出类似于
player executed command: /kill [HoloPanio]
我希望它输出 player executed command: /kill HoloPanio
如果有其他方法来导入参数,请告诉我,如果没有,请告诉我如何解决这个问题。
谢谢!
为了澄清我最初提出这个问题的意思是,我试图在 Java 中的 ArrayList 中存储一个字符串,当我去检索该值时,我只期望得到一个纯字符串。
事实上,我为分配字符串的变量使用了错误的类型。正如几个人指出的那样,我应该使用
String
类型。所以正确的做法是这样的:
public String target;
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
if (sender instanceof Player && args.length == 1) {
Player p = (Player) sender;
if (args.length > 0) {
switch (args.length) {
case 1:
Player player = Bukkit.getPlayer(args[0]);
if (player == null) {
sender.sendMessage("That player is not online");
} else if (player.isOnline()) {
Menus.openMenu(p);
target = player.getPlayerListName();
}
}
}
}
}
在上面的代码块中,我将
target
变量声明为字符串,然后使用 target = player.getPlayerListName();
行进一步设置它。这是定义价值的更有效的方式。需要对第一个块进行的唯一更改是更改:
ArrayList<String> target = Main.target;
到
String target = Main.target;
这篇文章最初是在我还在学习 java 的时候写的,我想补充一点,我不会使用 ArrayList 作为字符串,也不会像最初写这篇文章时那样静态定义它。
只是扩展提图斯在他们的评论中所说的内容。
不要使用
ArrayList
,而是尝试使用 String
作为目标类型。这将使输出为 player executed command: /kill HoloPanio
。
String target = Main.target;
@EventHandler
public void invClickEvent(InventoryClickEvent e) {
Inventory inv = e.getInventory();
Player player = (Player) e.getWhoClicked();
String name = inv.getName();
if ( name.equals(ChatColor.RED + "Ban Menu")) {
e.setCancelled(true);
int slot = e.getSlot();
if (slot < 0)
{
return;
}
if (slot == 0)
{
player.performCommand("kill " + target);
player.closeInventory();
return;
}
下面的内容将更新为空的
String
初始目标。请注意,将为此类的每个用户更新静态变量。这意味着访问此类的任何其他代码都将具有相同的目标。并且,访问此类的任何其他代码都可以更改目标。
public static String target = "";
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
if (sender instanceof Player && args.length == 1)
{
Player p = (Player) sender;
if (args.length > 0) {
switch (args.length)
{
case 1:
Player player = Bukkit.getPlayer(args[0]);
if (player == null) {
sender.sendMessage("That player is not online");
} else if (player.isOnline()) {
Menus.openMenu(p);
target = player.getPlayerListName();
}
也正如 Titus 所说,这不是最好的解决方案,因为作为静态变量,当您不希望它改变时,
target
可能会改变(或者当您希望它改变时最终会保持不变)。但是,这应该可以解决命令问题。
这是默认的 ArrayList toString。
使用 String.join 删除括号
String result = String.join("", list);
这是因为 ArrayList 类的 toString 方法。
扩展 ArrayList 类并覆盖 toString
ArrayList<String> list = new ArrayList<String>()
{
private static final long serialVersionUID = 1L;
@Override public String toString()
{
return super.toString().substring(1,super.toString().length-1) ;
}
};
从 Minecraft 的角度来看,如果您想取回元素列表而不需要打印集合,您可以使用
StringJoiner
来聚合它。
String values = String.join(",", target);
System.out.println(values);