【问题标题】:Dynamically return an ArrayList动态返回一个 ArrayList
【发布时间】:2016-02-27 22:05:21
【问题描述】:

我正在努力使用一种动态返回的方法

ArrayList<Player>

这是我所拥有的:

奇幻课

public class Fantasy {
   Squad team;
   ArrayList<Player> substitutes = team.getList(substitutes);
}

小队班

public class Squad {
   ArrayList<Player> substitutes;
   // Some code adding stuff into the ArrayList

   public ArrayList<Player> getList(String list) {
      return ArrayList<Player> list; << PROBLEM
   }
}

我想要一个方法getList(),通过它我可以传递一个ArrayList的名称,它将检查是否存在同名的ArratList,如果存在,将其作为ArrayList返回。

问题是我不知道如何检查是否有一个与我正在传递的字符串list 同名的 ArrayList。

可能的解决方案:

Map<String, ArrayList<Player>> arrayLists = new HashMap<String, ArrayList<Player>>(){{
    put("goalKeepers", goalKeepers);
    put("defenders", defenders);
    put("midFielders", midFielders);
    put("strikers", strikers);
    put("substitutes", substitutes);
}};

public ArrayList<Player> getList(String list) {
    return arrayLists.get(list);
}

但是,当我打电话时:

ArrayList test = getList("substitute");

或者每当我使用 getList();我收到以下错误:

无法从类型 Squad 对非静态方法 getList(String) 进行静态引用

【问题讨论】:

  • 我没有完全理解你的问题,但是有一个返回列表的getSubstitutes() 方法不是更有意义:return substitutes;
  • Squad 类中只有一个列表,因此您只有一个可能的列表要返回。此外,您的陈述“检查这种方法是否存在”对于您的其他问题也毫无意义。也许您应该查看术语“方法”在 Java 应用程序上下文中的含义。一般来说,您的问题按照目前的说法没有意义。
  • 列表从何而来?您是否试图按名称将其从任何对象成员中提取出来?这不是一个好主意,为什么不使用Map&lt;string,List &lt;Player&gt;&gt; 如果您需要将字符串与玩家集合配对
  • @Vulcan 我不想使用 getSubstitutes() 方法,因为我有超过 5 个 ArrayList,并且不希望有 5 个不同的方法返回它们。
  • @MarkB 我的意思是“ArrayList”而不是方法。抱歉,打错字了。

标签: java


【解决方案1】:

您应该有一个字段将球队名称映射到相应的球员列表中,而不是将替补名单存储在不同的实例变量中:

public class Squad {

   Map<String, List<Player>> substitutes = new HashMap<>();

   // add the player lists into the map

   /*
   * Returns the list of players for the given team name,
   * can be {@code null} if no player list has been stored
   * with the team name.
   */
   public List<Player> getList(String teamName) {
      return substitutes.get(teamName);
   }
}

【讨论】:

  • 我已经根据您的解决方案和我得到的错误更新了我的帖子。不过,它似乎应该可以工作。
  • 看来您没有按照我的建议进行操作,而是使用double brace initialization 声明了arrayLists 变量。只需添加 substitutes.put() 电话,例如在Squad的构造函数中;它会起作用的。
【解决方案2】:

Java 语言无法实现在代码的逻辑或流程中使用您分配给变量/方法的名称。

你必须自己实现它,例如:

public ArrayList getList(String name) {
    if(name.equals("substitutes") && substitutes != null) {
        return substitutes;
    }

    else {
        //handle error as you like
    }
}  

您可以为您想要访问的其他列表或对象添加else if 语句。

【讨论】:

  • 或者有一个Map&lt;String, List&gt;
【解决方案3】:

如果你的小队维持一个

HashMap<String, ArrayList<Player>>

您可以使用它返回给定字符串键的 ArrayList。

【讨论】:

    【解决方案4】:

    你可以使用

    Map<String,ArrayList<>> myMap = new HashMap<String,ArrayList<>>();
    

    在这里您可以找到 String 键上可用的 arraylist

    【讨论】:

      【解决方案5】:

      您想要做的事情可以通过使用反射来实现。实现看起来像这样:

      public List<Player> getList(String list) {
          try {
              Field field = this.getClass().getDeclaredField(list);
              return (List<Player>) field.get(this);
          } catch (IllegalAccessException e) {
               // do something sensible
          }
      }
      

      这会检查您当前对象中是否有具有您提供的名称的成员字段,并返回该字段的值。通常,在您真正知道自己在做什么并且别无选择之前,您应该避免反思。

      在您的情况下,您似乎有一个问题,即 Java 是一种编译语言,并且不提供一些您可以在常见脚本语言中使用的功能。编译语言的主要特性之一是您可以依赖该语言来为您找到参考。使用反射来尝试将字符串与字段匹配,您会放弃这个好处。 因此,更好的解决方案可能是像其他答案所建议的那样使用地图。

      最后一件事:遵循 OOP 的 SOLID 原则,您应该在类型声明中依赖 List 接口而不是 ArrayList 实现。 (SOLID 中的“D”)

      【讨论】:

        猜你喜欢
        • 2022-01-05
        • 1970-01-01
        • 2016-02-22
        • 1970-01-01
        • 2015-12-08
        • 2021-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多