Динамический массив string java

Как я могу объявить динамический массив строк в Java

Я использую String Array объявить как zoom z[]=new String[422]; . Но этот массив хранит значение от 0 до 32 , поэтому я получил null pointer exception после значения цикла 32 . Как решить эту проблему в java? Как объявить динамический массив в java?

5 ответов

Вы хотите использовать Set или List (например, HashSet , TreeSet , и т.д., или ArrayList , LinkedList и т.д.), так как Java не имеет массивы с динамическим размером.

List zoom = new ArrayList<>(); zoom.add("String 1"); zoom.add("String 2"); for (String z : zoom)

Изменить: Вот более краткий способ инициализации вашего списка с произвольным количеством значений с помощью varargs:

List zoom = Arrays.asList("String 1", "String 2", "String n"); 

Использование List является правильным. Для обсуждения того, почему, Джошуа Блох рассматривает использование интерфейсов в Effective Java — Статья 52: Обратитесь к объектам по их интерфейсам .

Это вызывает ошибку компиляции, когда я пытаюсь использовать его, JDK 1.6 и 1.7. Не принимайте аргумент предупреждения, я верю.

@EM-Creations EM-Creations Алмазный оператор не был введен до 1.7. Для версии 1.6 укажите также тип для конструктора ArrayList ( new ArrayList() ). Используемый как тело метода в допустимом классе, фрагмент будет скомпилирован в 1.7 как есть.

@EM-Creations EM-Creations Вы импортируете java.util.List или java.awt.List? Первый вариант работал для меня.

нет, нет возможности сделать динамическую длину массива в java. вы можете использовать ArrayList или другие List реализации.

Возможно, вы ищете Vector . При необходимости он автоматически расширяется. Это не лучший выбор, но он будет делать в простых ситуациях. Это стоит вашего часа, чтобы читать ArrayList .

Метод Array.newInstance(Class componentType, int length) должен использоваться для создания массива с динамической длиной.

Что вы ищете, это DefaultListModel — Переменная динамической строки.

Вот целый класс, который использует DefaultListModel, как если бы это был TStringList Delphi. Разница заключается в том, что вы можете добавлять строки в список без ограничений, и у вас есть такая же возможность при получении одиночная запись, указав запись int.

package YOUR_PACKAGE_GOES_HERE; //This is the StringList Class by i2programmer //You may delete these comments //This code is offered freely at no requirements //You may alter the code as you wish import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.DefaultListModel; public class StringList < public static String OutputAsString(DefaultListModel list, int entry) < return GetEntry(list, entry); >public static Object OutputAsObject(DefaultListModel list, int entry) < return GetEntry(list, entry); >public static int OutputAsInteger(DefaultListModel list, int entry) < return Integer.parseInt(list.getElementAt(entry).toString()); >public static double OutputAsDouble(DefaultListModel list, int entry) < return Double.parseDouble(list.getElementAt(entry).toString()); >public static byte OutputAsByte(DefaultListModel list, int entry) < return Byte.parseByte(list.getElementAt(entry).toString()); >public static char OutputAsCharacter(DefaultListModel list, int entry) < return list.getElementAt(entry).toString().charAt(0); >public static String GetEntry(DefaultListModel list, int entry) < String result = ""; result = list.getElementAt(entry).toString(); return result; >public static void AddEntry(DefaultListModel list, String entry) < list.addElement(entry); >public static void RemoveEntry(DefaultListModel list, int entry) < list.removeElementAt(entry); >public static DefaultListModel StrToList(String input, String delimiter) < DefaultListModel dlmtemp = new DefaultListModel(); input = input.trim(); delimiter = delimiter.trim(); while (input.toLowerCase().contains(delimiter.toLowerCase())) < int index = input.toLowerCase().indexOf(delimiter.toLowerCase()); dlmtemp.addElement(input.substring(0, index).trim()); input = input.substring(index + delimiter.length(), input.length()).trim(); >return dlmtemp; > public static String ListToStr(DefaultListModel list, String delimiter) < String result = ""; for (int i = 0; i < list.size(); i++) < result = list.getElementAt(i).toString() + delimiter; >result = result.trim(); return result; > public static String LoadFile(String inputfile) throws IOException < int len; char[] chr = new char[4096]; final StringBuffer buffer = new StringBuffer(); final FileReader reader = new FileReader(new File(inputfile)); try < while ((len = reader.read(chr)) >0) < buffer.append(chr, 0, len); >> finally < reader.close(); >return buffer.toString(); > public static void SaveFile(String outputfile, String outputstring) < try < FileWriter f0 = new FileWriter(new File(outputfile)); f0.write(outputstring); f0.flush(); f0.close(); >catch (IOException ex) < Logger.getLogger(StringList.class.getName()).log(Level.SEVERE, null, ex); >> > 

Методы OutputAs предназначены для вывода записи как int, double и т.д., так что вам не нужно преобразовывать из строки с другой стороны.

Читайте также:  Тег textarea, атрибут wrap

SaveFile и LoadFile предназначены для сохранения и загрузки строк в файлы и из них.

StrToList и ListToStr должны размещать разделители между каждой записью.

ех. 1 < >2 < >3 < 4 < >если » < >» обозначает разделитель, а 1 2 3 и 4 — записи.

AddEntry и GetEntry должны добавлять и получать строки в и из DefaultListModel.

RemoveEntry — удалить строку из DefaultListModel.

Вы используете DefaultListModel вместо массива здесь следующим образом:

DefaultListModel list = new DefaultListModel(); //now that you have a list, you can run it through the above class methods. 

Источник

Java-массивы. Динамические массивы в Java

Java_Deep_19.8-5020-2f283e.png

Массив — набор определённого числа однотипных элементов. Использование массива позволяет нам не создавать большое количество переменных, а создать всего лишь одну переменную, имеющую вид массива. В отличие от стандартных переменных массивы содержат больше, чем одно значение. В программировании это очень важно, ведь при разработке софта может потребоваться огромное количество данных.

Лучшая ассоциация для массива — стена с почтовыми ячейками. Каждая ячейка помечена квартирными номерами (индексы массива), внутри лежат газеты и письма (элементы массива), а получить содержимое можно, открыв ящик ключом (обратиться к содержимому по позиции элемента в массиве через индекс). При этом содержимое массива может включать в себя как простые данные (это одномерный массив), так и несколько вложенных массивов (это многомерный массив).

Массив однороден, и во всех ячейках должны храниться элементы одного типа. Если это int, то мы говорим про массив целых чисел, который может содержать лишь целые числа. Массив строк будет содержать лишь строки, а массив, состоящий из элементов созданного класса Dog, может содержать лишь объекты Dog.

Как происходит объявление массива в Java

Как и любую переменную в Java, массив надо объявить. Для этого есть два способа. Первый больше отвечает стилю Java, второй является наследием языка C.

1-20219-84f278.png

Вне зависимости от способа, dataType — это тип переменных в массиве. Посмотрите внимательно на примеры — в них объявлены 2 массива. Один предназначен для целых чисел типа int, другой — для объектов типа Object.

Читайте также:  Optparse python 3 документация на русском

Можно сказать, что во время объявления массива ему присваивается как имя (ArrayName), так и тип переменных.

Создание массива

Чтобы создать массив в Java, нужно зарезервировать место в памяти, для чего используем оператор new:

Здесь у нас typeOfArray — тип массива, length — длина массива или число ячеек, выраженное в целых числах (int). Но мы лишь выделили память под массив, не связав его ни с какой переменной, ранее объявленной. Как правило, сначала массив объявляют, потом создают:

 
int[] myArray; // объявление массива myArray = new int[10]; // создание массива, выделение памяти на 10 элементов типа int

Итак, объявлен массив из целых чисел с именем myArray. После объявления мы сообщили, что массив состоит из 10 ячеек. Но можно использовать и более сокращённый синтаксис:

 
int[] myArray = new int[10]; // объявление и выделение памяти за один раз

Что же, мы создали массив с помощью new. После этого в его ячейках будут записаны значения по умолчанию. Например, для численных типов — это нули (0), для boolean — false, а если говорить о ссылочных типах, то null. Это значит, что после выполнения кода

у нас на выходе будет массив из 10 целых чисел, причём в каждой ячейке будет записан 0.

Длина массива length

Длина массива — число элементов, под которое этот массив рассчитан. Длину массива изменить после создания нельзя.

Ещё нюанс: элементы массива в Java нумеруются с нуля. Таким образом, массив на 10 элементов состоит из чисел в диапазоне 0-9.

2-20219-9b55f8.png

Если нужно получить доступ к длине нашего массива, используют переменную length:

 
int[] myArray = new int[10]; // создали массив, присвоили имя myArray System.out.println(myArray.length); // вывели в консоль длину массива

Инициализация массива

Инициализация — это заполнение массива конкретными данными, а не данными по умолчанию.

Нижеследующий код позволит создать массив, включающий в себя 4 сезона года. Также мы выполним заполнение массива строками-названиями сезонов:

 
String[] seasons = new String[4]; /* выполнили объявление и создание массива из 4 строк, где по умолчанию записано null, ведь строка — ссылочный тип данных*/ seasons[0] = "Winter"; /* в первую ячейку записали строку Winter*/ seasons[1] = "Spring"; /* во вторую ячейку (номер 1) записали строку Spring и т. д.*/ seasons[2] = "Summer"; seasons[3] = "Autumn";

Так мы записали названия всех сезонов. Но в принципе можно всё сделать проще, совместив инициализацию и объявление:

 
String[] seasons = new String[] ;

Или даже так, опустив оператор new:

Динамический массив в Java

Минус массива — статичность, то есть необходимость задавать размер заранее. Для этого и придумали динамический массив, который может менять размер в процессе выполнения программы. Например, статические массивы работают по следующей схеме:

3-20219-286ccf.png

А динамические массивы в Java функционируют несколько иначе:

4-20219-c45fc5.png

Так как для копирования массива используется специальная нативная функция, проблем с «переездом» не возникает.

В общем, как вы уже догадались, динамические массивы применяются во время обработки наборов однородных данных, размер которых на момент написания программы нам неизвестен.

Источник

Задание

Задание на дом - к четвергу 29 сентября - выполнить задачки в http://mdl.sch239.net/ :

Если первый символ - заглавная английская буква: выведите “Capital letter!”, если маленькая английская буква: выведите “Lowercase letter!”, если цифра: “Digit!”, если пробел: “Space!”, иначе - “Something else!”.

Затем выведите размер строки ввиде “Length of the string: N”.

2) Выведите английский алфавит. Сначала заглавными буквами в одну строку, а затем на второй строке - маленькими. Пожалуйста не копируйте просто строку правильного ответа, сделайте это на базе изменения ASCII-кодов символов и циклов (чтобы пробежать по всем буквам алфавита).

3) Пользователь вводит строки одну за другой.

Напишите цикл while . Если он введет строку “exit” - воспользуйтесь командой break чтобы выйти из цикла.

В остальных случаях - преобразуйте строку в число и добавьте его в динамический массив целых чисел.

После этого считайте еще одно число X от пользователя и выведите количество чисел в массиве которые меньше или равны X.

Возможные ошибки

1) Если вы видите что-то вроде /var/www/html/jobe/application/libraries/../../runguard/runguard: warning: timelimit exceeded при отправке решения в mdl:

Система тестирования подвисла и не успела в рамках ограничения на время тестирования задания его проверить. При этом если вы повторно попробуете отправить задание - система ничего не сделает т.к. думает что раз решение не изменилось, то исход будет такой же.

Решение - добавить фиктивное изменение в код (например пустую строку) и переотправить.

Источник

Задание

Задание на дом - к позднему вечеру понедельника 28 сентября - выполнить задачки в http://mdl.sch239.net/ :

Если первый символ - заглавная английская буква: выведите “Capital letter!”, если маленькая английская буква: выведите “Lowercase letter!”, если цифра: “Digit!”, если пробел: “Space!”, иначе - “Something else!”.

Затем выведите размер строки ввиде “Length of the string: N”.

2) Выведите английский алфавит. Сначала заглавными буквами в одну строку, а затем на второй строке - маленькими. Пожалуйста не копируйте просто строку правильного ответа, сделайте это на базе изменения ASCII-кодов символов и циклов (чтобы пробежать по всем буквам алфавита).

3) Пользователь вводит строки одну за другой.

Напишите цикл while . Если он введет строку “exit” - воспользуйтесь командой break чтобы выйти из цикла.

В остальных случаях - преобразуйте строку в число и добавьте его в динамический массив целых чисел.

После этого считайте еще одно число X от пользователя и выведите количество чисел в массиве которые меньше или равны X.

Возможные ошибки

1) Если вы видите что-то вроде /var/www/html/jobe/application/libraries/../../runguard/runguard: warning: timelimit exceeded при отправке решения в mdl:

Система тестирования подвисла и не успела в рамках ограничения на время тестирования задания его проверить. При этом если вы повторно попробуете отправить задание - система ничего не сделает т.к. думает что раз решение не изменилось, то исход будет такой же.

Решение - добавить фиктивное изменение в код (например пустую строку) и переотправить.

  • Полярный Николай Вадимович
  • Моя почта: PolarNick239@gmail.com
  • +7 (911) 959-11-70
  • быстро отвечаю в Telegram (ответ может быть в стиле "вечером отвечу")
  • можно писать в PolarNick

Источник

Оцените статью