如何在Java中从ArrayList中提取字符串?

问题描述 投票:0回答:4

所以我正在为 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 作为字符串,也不会像最初写这篇文章时那样静态定义它。

java arraylist minecraft
4个回答
1
投票

只是扩展提图斯在他们的评论中所说的内容。

不要使用

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
可能会改变(或者当您希望它改变时最终会保持不变)。但是,这应该可以解决命令问题。


0
投票

这是默认的 ArrayList toString。

使用 String.join 删除括号

String result = String.join("", list);

-1
投票

这是因为 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) ;
    }
};

-1
投票

从 Minecraft 的角度来看,如果您想取回元素列表而不需要打印集合,您可以使用

StringJoiner
来聚合它。

String values = String.join(",", target);
System.out.println(values);
© www.soinside.com 2019 - 2024. All rights reserved.