Я новичок в Java и не могу найти структуру для следующих действий.
Мне нужен массив фиксированной длины. Каждый элемент должен быть массивом (или списком) переменной длины, содержащим строки. Итак, я пробовал ...
ArrayList<String>[] wordList = new ArrayList[maxWordLength];
Я получаю пощечину от Java за то, что «Main.java использует непроверенные или небезопасные операции». и когда я пытаюсь добавить элемент, я получаю "java.lang.NullPointerException"
wordList[oneWord.length()-1].add(oneWord);
Как мне создать свою структуру, чтобы Java была довольна?
Вы смешиваете ArrayList и Array, то, что вы хотите, кажется просто массивом. Может просто String[] words = new String[maxWordLength]
@SomeDude, но разве это не даст мне одномерный массив? Мне нужно два измерения.




Java не любит массивы универсальных типов. (См. Ограничения на дженерики в руководствах по Java.) Вместо этого используйте список списков:
List<List<String>> wordList = new ArrayList<>(maxWordLength);
Это создает список с начальной емкостью maxWordLength, который может содержать списки String. Первоначальный размер (в отличие от емкости) будет равен 0. Затем вы можете добавить отдельные списки строк в wordList. Чтобы избежать появления NullPointerException позже, вам следует заполнить wordList пустыми списками для начала:
for (int i = 0; i < maxWordLength; i++) {
wordList.add(new ArrayList<>());
}
Наконец, вы можете добавить слово в конкретный список в wordList с помощью:
wordList.get(oneWord.length() - 1).add(oneWord);
Это не заставляет wordList иметь фиксированную длину, но в остальном должно соответствовать вашим требованиям.
Будь проще: Массив со всеми элементами как массив строк:
List<List<String>> listOfStringsArray = new ArrayList<>();
List<String> stringArray = Arrays.asList("String1", "String2");
listOfStringsArray.add(stringArray);
List - это интерфейс, который должны реализовывать конкретные классы, такие как ArrayList и LinkedList.
ArrayList - это List, оптимизированный для последовательного чтения и добавления и поддерживаемый внутренним массивом.
ArrayList<blah> или List<blah> - это List, который содержит объекты, наследующие blah (или, если это интерфейс, объекты, которые его реализуют).
ArrayList[] на самом деле является массивом ArrayList, когда вы new ArrayList[x], что на самом деле означает создание массива длиной x, содержащего ArrayList. Каждый из ArrayList не назначен, поэтому это неинициализированный объект, по умолчанию это null во многих компиляторах, но вы не можете на это полагаться.
Итак, предположим, вы создали этот массив фиксированной длины, который содержит список переменной длины. вам либо нужно выполнить цикл по массиву и сказать wordList[i] = new ArrayList<String>(), либо вы должны выполнить нулевую проверку перед его назначением и создать новый ArrayList для каждого назначения
Это потому, что у вас есть массив нулевых
ArrayLists.