2010-08-30 28 views
20

Tôi đang sử dụng Chuỗi chuỗi khai báo là zoom z[]=new String[422];. Nhưng mảng này lưu trữ giá trị từ 0 đến 32, vì vậy tôi nhận được null pointer exception sau giá trị vòng lặp 32.Làm cách nào tôi có thể khai báo mảng Chuỗi động trong Java

Làm thế nào để giải quyết vấn đề này trong java?

Làm cách nào để khai báo mảng động trong java?

+7

Nếu chỉ có một cách mô tả một số mã, như .... Tôi không biết, hiển thị mã cho chúng tôi ... – skaffman

Trả lời

39

Bạn muốn sử dụng một Set hoặc List thực hiện (ví dụ HashSet, TreeSet, vv, hoặc ArrayList, LinkedList, vv ..), vì Java không có mảng tự động kích thước.

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

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

Edit: Đây là một cách gọn gàng hơn để khởi Danh sách của bạn với một số tùy ý các giá trị sử dụng varargs:

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

Lưu ý, đây phải là "ArrayList", không phải "Danh sách"; điều đó gây ra cho tôi một vài vấn đề. –

+0

Sử dụng 'Danh sách ' là chính xác. Để thảo luận về lý do tại sao, Joshua Bloch đề cập đến việc sử dụng các giao diện trong [Effective Java - Item 52: Tham khảo các đối tượng theo giao diện của họ] (http://jtechies.blogspot.com/2012/07/item-52-refer-to-objects -by-their.html). – Chadwick

+0

Nó gây ra lỗi biên dịch khi tôi cố gắng sử dụng nó, JDK 1.6 và 1.7. Không có cảnh báo đối số, tôi tin. –

5

không, không có cách nào để làm cho độ dài mảng động trong java. bạn có thể sử dụng ArrayList hoặc các thay đổi khác List.

3

Có lẽ bạn đang tìm kiếm Vector. Công suất của nó sẽ tự động được mở rộng nếu cần. Nó không phải là lựa chọn tốt nhất nhưng sẽ làm trong những tình huống đơn giản. Thay vào đó, bạn nên dành thời gian để đọc lên số ArrayList.

0

Điều bạn đang tìm kiếm là DefaultListModel - Biến danh sách chuỗi động.

Đây là toàn bộ lớp sử dụng DefaultListModel như thể đó là TStringList của Delphi. Sự khác biệt là bạn có thể thêm Strings vào danh sách mà không giới hạn và bạn có cùng khả năng nhận được một mục nhập bằng cách chỉ định mục nhập 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 phương pháp này cho outputting một mục như int, double, vv ... do đó bạn không cần phải chuyển đổi từ chuỗi ở phía bên kia.

SaveFile & LoadFile để lưu và tải chuỗi đến và từ tệp.

StrToList & ListToStr để đặt dấu phân cách giữa mỗi mục nhập.

ví dụ: 1 <> 2 <> 3 <> 4 <> nếu "<>" là dấu phân cách và 1 2 3 & 4 là các mục nhập.

AddEntry & GetEntry sẽ thêm và nhận chuỗi từ và đến DefaultListModel.

RemoveEntry là xóa chuỗi khỏi DefaultListModel.

Bạn sử dụng DefaultListModel thay vì một mảng ở đây như thế này:

DefaultListModel list = new DefaultListModel(); 
//now that you have a list, you can run it through the above class methods. 
Các vấn đề liên quan