【问题标题】:Using Arrays.asList() in Java for 2d Arrays [duplicate]在 Java 中使用 Arrays.asList() 处理二维数组 [重复]
【发布时间】:2015-12-04 19:40:43
【问题描述】:

我无法弄清楚以下代码的一些内容:

public final String[][] pockets = {{"STATUS CHANGERS", "RUNES", "KEY ITEMS", "TROPHIES"},
        {"POTION", "SUPER POTION", "FULL HEAL"},{"ARMOR+","ATTACK+","EXP+","HEALTH+", "DISPELL+"},
        {"QUEST ITEMS","STORY ITEMS","JOURNAL"},{TROPHIES}};


public final List<String[]> Pockets = Arrays.asList(pockets); //why couldn't I define it in the method, I wonder?

我想弄清楚为什么我不能像普通数组一样在asList() 方法中定义二维数组。另外,我知道必须有一个 Java 子类来导入或更语义化的方法。

【问题讨论】:

  • 请澄清就像你可能是一个普通的数组。

标签: java arrays


【解决方案1】:

为了将二维数组E[][]转换为二维List&lt;List&lt;E&gt;&gt;,可以使用以下代码(请看下面的解释):

public final String[][] pocketArray = {{"STATUS CHANGERS", "RUNES", "KEY ITEMS", "TROPHIES"},
        {"POTION", "SUPER POTION", "FULL HEAL"}, {"ARMOR+", "ATTACK+", "EXP+", "HEALTH+", "DISPELL+"},
        {"QUEST ITEMS", "STORY ITEMS", "JOURNAL"}, {"TROPHIES"}};


public final List<List<String>> pocketList;

public Test()
{
    pocketList = new ArrayList<>(pocketArray.length);
    for (String[] pocket : pocketArray)
    {
        List<String> currentSubList = new ArrayList<>(pocket.length);
        // Nice and fast way instead of iterating over the whole array and adding the strings to the list.
        Collections.addAll(currentSubList, pocket);
        // instead, you could do something like this:
        //
        // for (String currentString : pocket)
        // {
        //     currentSubList.add(currentString);
        // }
        //
        pocketList.add(currentSubList);

        // Alternatively, you could use something like this:
        // pocketList.add(Arrays.asList(pocket));
    }
}

基本上,这段代码创建了一个新的ArrayList&lt;List&lt;String&gt;&gt; 用于稍后保存所有子列表。 然后它遍历数组,并将所有子数组保存到列表中。


顺便说一句,pockets 与 Pockets 之类的名称稍后容易引起混淆,我建议您以小写字母开头的字段名称并根据用途和类型对其进行唯一命名,就像我在上面所做的那样.

【讨论】:

    【解决方案2】:

    这是你想要做的吗? 注意new String[][]的使用

     public final List<String[]> Pockets = Arrays.asList(new String[][]{{"STATUS CHANGERS", "RUNES", "KEY ITEMS", "TROPHIES"},
            {"POTION", "SUPER POTION", "FULL HEAL"},{"ARMOR+","ATTACK+","EXP+","HEALTH+", "DISPELL+"},
            {"QUEST ITEMS","STORY ITEMS","JOURNAL"},{"TROPHIES"}});
    

    PS:Pockets不是标准命名约定,我建议pocketList

    【讨论】:

      【解决方案3】:

      我想弄清楚为什么我不能像普通数组一样在 asList() 方法中定义二维数组。

      当您不告诉我们您尝试了什么时,我们无法回答为什么您尝试的方法不起作用。但是,我想您真正想知道的是如何通过传递单个元素而不是首先构造二维数组来通过Arrays.asList() 生成List&lt;String[]&gt;。应该是这样的:

      public final List<String[]> pockets = Arrays.asList(
              new String[]{"STATUS CHANGERS", "RUNES", "KEY ITEMS", "TROPHIES"},
              new String[]{"POTION", "SUPER POTION", "FULL HEAL"},
              new String[]{"ARMOR+","ATTACK+","EXP+","HEALTH+", "DISPELL+"},
              new String[]{"QUEST ITEMS","STORY ITEMS","JOURNAL"},
              new String[]{"TROPHIES"}
          );
      

      特别注意Java没有数组字面量,只有数组initializers(可以与数组声明相关联)和数组构造函数,比如上面的代码.我推测在您的尝试中,您省略了构成这些构造函数的 new String[] 位。如果没有其他原因,这些位是指定数组的元素类型所必需的。

      另外,我知道必须有一个要导入的 Java 子类或更语义化的方法。

      我不明白你的意思。您已经在使用java.util.Array 类来执行构造,并且正在构建java.util.List。我想对于大多数目的,我建议使用 Lists (List&lt;List&lt;String&gt;&gt;) 的 List 并完全避免使用数组,但我不确定这是否适合您的目的。

      【讨论】:

        猜你喜欢
        • 2017-09-20
        • 1970-01-01
        • 1970-01-01
        • 2017-10-28
        • 2019-05-09
        • 2014-07-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多