【问题标题】:Getting variable name from a string for ArrayList从 ArrayList 的字符串中获取变量名
【发布时间】:2015-03-22 12:24:14
【问题描述】:

我想知道是否可以从 Java 中的字符串中检索变量名,但这可以在 ArrayList 中使用。我已经阅读了 StackOverflow 上关于这样做的无数帖子,例如使用地图,但我不断收到“构造函数 ArrayList(String) 未定义”。我想做的就是:

 int first = 1; //These can change between each other, depending on the circumstances, 
                  like second could equal 3.
 int second = 2;
 int third = 3;
 int fourth = 4;

            List<String> player1List = new LinkedList<String>(Arrays.asList(player1));
            List<String> player2List = new LinkedList<String>(Arrays.asList(player2));
            List<String> player3List = new LinkedList<String>(Arrays.asList(player3));
            List<String> player4List = new LinkedList<String>(Arrays.asList(player4));

                String FirstString = "player" + first + "List";
                String SecondString = "player" + second + "List";
                String ThirdString = "player" + third + "List";
                String FourthString = "player" + fourth + "List";

                List<String> fusedPlayer1 = new ArrayList<String>(FirstString);
                fusedPlayer1.addAll(FourthString);

                List<String> fusedPlayer1 = new ArrayList<String>(SecondString);
                fusedPlayer1.addAll(ThirdString);

player1player2player3player4 都是字符串。现在,您可能想知道我为什么要这样做,但这只是一个示例,在我的实际程序中,使用这种方法有更好的理由。我是Java的初学者,所以请原谅我缺乏知识... 谢谢!

更新

新代码:

int first = 1; //These can change between each other, depending on the circumstances, 
                      like second could equal 3.
     int second = 2;
     int third = 3;
     int fourth = 4;

                List<String> player1List = new LinkedList<String>(Arrays.asList(player1));
                List<String> player2List = new LinkedList<String>(Arrays.asList(player2));
                List<String> player3List = new LinkedList<String>(Arrays.asList(player3));
                List<String> player4List = new LinkedList<String>(Arrays.asList(player4));

                    String FirstString = "player" + first + "List";
                    String SecondString = "player" + second + "List";
                    String ThirdString = "player" + third + "List";
                    String FourthString = "player" + fourth + "List";

             Map<String, String> map = new HashMap<String, String>();
             map.put(FirstString,  "player" + first   + "List");
             map.put(SecondString, "player" + second  + "List");
             map.put(ThirdString,  "player" + third   + "List");
             map.put(FourthString, "player" + fourth  + "List");

        List<String> fusedPlayer1 = new ArrayList<String>();
        fusedPlayer1.add(map.get(FirstString));
        fusedPlayer1.add(map.get(FourthString));

        List<String> fusedPlayer2 = new ArrayList<String>();
        fusedPlayer2.add(map.get(SecondString));
        fusedPlayer2.add(map.get(ThirdString));

【问题讨论】:

  • 感谢您指出这一点,我一定会修复它。

标签: java arraylist linked-list


【解决方案1】:

这一行:

List<String> fusedPlayer1 = new ArrayList<String>(FirstString);

告诉 Java 你要调用 ArrayList 构造函数,它接受 String 作为参数。问题是ArrayList 没有这样的构造函数,因此“构造函数 ArrayList(String) 未定义。”。

ArrayList 类提供了三个构造函数,它们具有以下签名:

public ArrayList(int initialCapacity) { ... }

public ArrayList() { ... }

public ArrayList(Collection<? extends E> c) { ... }

我怀疑您正在尝试做的是创建 ArrayList 与参数 String 作为初始元素。由于它是单个 String 而不是一组 Strings,因此您最好执行以下操作:

List<String> fusedPlayer1 = new ArrayList<String>();
fusedPlayer1.add(FirstString);

还需要注意的是,从Java 7开始,你不再需要指定两次类型,所以你可以写如下:

List<String> fusedPlayer1 = new ArrayList<>();

然后编译器使用类型推断来计算出ArrayList的泛型类型应该是什么。

根据您的一些 cmets,Map 构造似乎更适合您的需求:

Map<Integer, LinkedList<String>> players = new HashMap<>();

players.put(1, player1List);
players.put(2, player2List);
players.put(3, player3List);
players.put(4, player4List);

然后当您需要访问时,例如,player3List,您只需执行以下操作:

players.get(3); // This will return the LinkedList associated with the Integer 3.

最后,正如您从上面的语法着色中看到的那样,Java 的约定是您的变量名应该是:

  • namedInCamelCase,即第一个单词全部小写,后面单词的首字母大写,或者
  • NAMED_IN_CAPS_WITH_UNDERSCORES 如果变量同时是 finalstatic

类名应该是CamelCaseWithAnInitialCapital

【讨论】:

  • 不过,可以肯定的是,这是FirstString 链接到player + first + List,最终链接到player1List,对吗?
  • @PhilipBecker 您所做的只是创建一个包含文本"playerXList"String,然后将该String 对象存储在ArrayList 中——仅此而已。
  • 是否有办法让程序知道,例如,包含 player1List 的字符串正在引用名为 player1List 的列表?
  • @PhilipBecker 不容易。最好的办法是将每个LinkedList 存储在Map 中,以StringInteger 为键,然后您可以使用该键访问适当的LinkedList
  • @PhilipBecker 否 - 您没有将任何内容放入 Map 以便能够将其取出。 Map 也需要是正确的类型,所以像 Map&lt;String, List&lt;String&gt;&gt; 而不是 Map&lt;String, String&gt;
【解决方案2】:

您要么需要将列表存储在地图中,要么使用二维数组,其中第一个维度是索引。使用反射也可以使用变量名(至少如果您的变量是字段),但这是非常糟糕的做法。

这就是你如何生成 4 个列表并用一个整数变量来寻址它们:

int first = 0;
List<String>[] lists = new List<String>[4];
lists[0] = new ArrayList<String>();
lists[1] = new ArrayList<String>(); ...
List<String> firstList = lists[first];

【讨论】:

    猜你喜欢
    • 2022-12-15
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    • 2012-04-04
    • 1970-01-01
    • 2011-06-15
    • 2022-10-21
    相关资源
    最近更新 更多