2010-08-30 5 views
20

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

Как решить эту проблему в java?

Как объявить динамический массив в java?

+7

Если бы был способ описания некоторого кода, например .... Я не знаю, показывая нам код ... – skaffman

ответ

39

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

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

for (String z : zoom) { 
    System.err.println(z); 
} 

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

List<String> zoom = Arrays.asList("String 1", "String 2", "String n"); 
+0

Обратите внимание, что это должен быть «ArrayList», а не «List»; что вызвало у меня несколько проблем. –

+0

Использование 'List ' является правильным. Для обсуждения того, почему Джошуа Блох рассматривает использование интерфейсов в [Эффективной Java - Пункт 52: См. Объекты по их интерфейсам] (http://jtechies.blogspot.com/2012/07/item-52-refer-to-objects -по-their.html). – Chadwick

+0

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

5

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

3

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

0

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

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

FileName: StringList.java

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, двойной и т.д ... так что вам не придется конвертировать из строки на другую сторону.

SaveFile & LoadFile - сохранить и загрузить строки в файлы и из них.

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

ex. 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. 
Смежные вопросы