如何在Java中从ArrayList提取字符串?解决Minecraft插件参数带括号问题
解决Minecraft插件中ArrayList传递命令参数带括号的问题
嘿,我之前开发Minecraft插件时也踩过这个坑!你遇到的参数周围自动加括号的问题,本质是ArrayList默认的toString()方法导致的——当你直接把ArrayList拼接到字符串里时,它会自动调用这个方法,返回的格式就是[元素1, 元素2, ...],括号和逗号都是默认自带的。
问题重现(大概率你是这么写的)
比如你在传递参数后直接打印ArrayList:
// 从主类获取命令参数并转成ArrayList ArrayList<String> argsList = new ArrayList<>(Arrays.asList(args)); // 直接拼接输出 System.out.println(player.getName() + " executed command: /mycmd " + argsList);
这时候输出就会变成:
player executed command: /mycmd [arg1, arg2]
两种简单的解决方法
1. 用String.join()快速拼接(推荐,Java 8+可用)
这是最简洁的方式,直接把List里的元素用空格分隔拼接成字符串,完全不会带括号:
// 把ArrayList转成无括号的参数字符串 String argsStr = String.join(" ", argsList); // 输出结果 System.out.println(player.getName() + " executed command: /mycmd " + argsStr);
2. 手动循环拼接(兼容低版本Java)
如果你的插件需要兼容Java 8以下的版本,可以用StringBuilder手动拼接:
StringBuilder argsStr = new StringBuilder(); for (String arg : argsList) { // 不是第一个元素的话先加空格 if (argsStr.length() > 0) { argsStr.append(" "); } argsStr.append(arg); } System.out.println(player.getName() + " executed command: /mycmd " + argsStr);
额外小建议
其实如果只是为了在类之间传递命令参数,不一定非要转成ArrayList——Bukkit的命令参数本身就是String[]数组,直接传递数组也很方便,之后同样用String.join(" ", args)就能得到干净的参数字符串。
举个完整的跨类传递示例:
// 主类(处理命令) public class MyMainPlugin extends JavaPlugin implements CommandExecutor { @Override public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { if (cmd.getName().equalsIgnoreCase("mycmd")) { // 把参数传递给日志类处理 CommandLogger.logPlayerCommand(sender.getName(), args); return true; } return false; } } // 日志类(接收并输出参数) public class CommandLogger { public static void logPlayerCommand(String playerName, String[] args) { String argsStr = String.join(" ", args); System.out.println(playerName + " executed command: /mycmd " + argsStr); } }
这样输出的结果就是你想要的干净格式:
player executed command: /mycmd arg1 arg2
内容的提问来源于stack exchange,提问作者Jackson Roberts
相关产品推荐
相关产品推荐

