2015-12-04 3 views
0

У меня возникли проблемы выяснить ута несколько вещей, о следующем коде:Использование Arrays.asList() в Java для 2d массивов

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? 

Я пытаюсь выяснить, почему я не мог определить 2d массив в метод asList(), как и обычный массив. Кроме того, я знаю, что должен быть подкласс Java для импорта или более семантический подход.

+3

Просьба уточнить, что вы можете создать обычный Array_. –

ответ

3

Для того, чтобы преобразовать двумерный массив E[][] в двумерной List<List<E>>, вы можете использовать следующий код (смотрите ниже для объяснения):

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<List<String>> для удерживая все под-списки позже. Затем он выполняет итерацию по массиву и сохраняет все подмассивы в списке.


Кстати, такие имена, как 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

0

Я пытаюсь понять, почему я не мог определить 2d-массив в методе asList(), как если бы вы имели обычный массив.

Мы не можем ответить, почему то, что вы пробовали, не работало, когда вы не сказали нам, что вы пробовали. Я предполагаю, что вы действительно хотите знать, как создать List<String[]> через Arrays.asList(), передав отдельные элементы, а не сначала построив 2D-массив. Это было бы так:

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 не имеет массива литералов, только массив Инициализаторы (которые могут быть связаны с декларациями массива), и массив конструкторами, такие, как в приведенном выше коде. Я предполагаю, что в ваших попытках вы пропустили new String[] биты, которые создают эти конструкторы. Эти биты необходимы для указания типа элемента массивов, если не по какой-либо другой причине.

Кроме того, я знаю, что должен быть подкласс Java для импорта или более семантический подход.

Я понятия не имею, что вы имеете в виду. Вы уже используете класс java.util.Array для выполнения строительства, и вы строите java.util.List. Думаю, для большинства целей я бы рекомендовал использовать ListList с (List<List<String>>) и вообще избегать массивов, но я не могу быть уверен, подходит ли это для ваших целей.

Смежные вопросы