2011-11-01 48 views
80

Tôi muốn biết nếu nó được an toàn/khuyến khích để chuyển đổi từ ArrayList thành mảng? Tôi có một tập tin văn bản với từng dòng một chuỗi:Từ Arraylist to Array

1236 
1233 
4566 
4568 
.... 

Tôi muốn đọc chúng vào danh sách mảng và sau đó tôi chuyển nó sang Array. Có khuyến khích/pháp lý để làm điều đó không?

cảm ơn

+7

Bạn * có thể *, nhưng bạn chưa cung cấp cho chúng tôi đủ thông tin để cho bạn biết đó có phải là ý hay hay không. –

+5

ArrayLists là tốt. Lý do duy nhất tôi có thể thấy để chuyển đổi thành một mảng là nếu bạn cần gọi một phương thức yêu cầu nó. –

Trả lời

162

it is safe to convert an ArrayList to an Array. Cho dù đó là một ý tưởng tốt phụ thuộc vào mục đích sử dụng của bạn. Bạn có cần các hoạt động mà ArrayList cung cấp không? Nếu vậy, hãy giữ nó ArrayList. Khác chuyển đổi đi!

ArrayList<Integer> foo = new ArrayList<Integer>(); 
foo.add(1); 
foo.add(1); 
foo.add(2); 
foo.add(3); 
foo.add(5); 
Integer[] bar = foo.toArray(new Integer[foo.size()]); 
System.out.println("bar.length = " + bar.length); 

đầu ra

bar.length = 5 
+0

Điều gì xảy ra nếu ArrayList trống? – ThanosFisherman

+22

Sau đó, nó trống. – IMustBeSomeone

4
ArrayList<String> myArrayList = new ArrayList<String>(); 
... 
String[] myArray = myArrayList.toArray(new String[0]); 

Dù đó là một "ý tưởng tốt" sẽ thực sự phụ thuộc vào trường hợp sử dụng của bạn.

+0

cảm ơn, chỉ tò mò muốn biết: tôi không cần phải khai báo kích thước mảng? –

+0

JavaDocs là bạn của bạn. Nếu mảng được truyền vào quá nhỏ, mảng mới sẽ được trả về. Các phiên bản khác của phương thức mà không có args trả về một mảng 'Object' –

2

giả sử v là một ArrayList:

String[] x = (String[]) v.toArray(new String[0]); 
1
ArrayList<String> a = new ArrayList<String>(); 
a.add("test"); 
@SuppressWarnings("unused") 
String[] array = (String[]) a.toArray(); 

Nó phụ thuộc vào những gì bạn muốn đạt được nếu bạn cần phải thao tác mảng sau nó sẽ có chi phí nỗ lực hơn giữ chuỗi trong ArrayList. Bạn cũng có quyền truy cập ngẫu nhiên với một ArrayList theo số list.get(index);

57

Đây là cách tốt nhất (IMHO).

List<String> myArrayList = new ArrayList<String>(); 
//..... 
String[] myArray = myArrayList.toArray(new String[myArrayList.size()]); 

Mã này hoạt động cũng:

String[] myArray = myArrayList.toArray(new String[0]); 

Nhưng nó kém hiệu quả: các mảng chuỗi được tạo ra hai lần: lần đầu tiên zero-length mảng được tạo ra, sau đó mảng thực kích thước được tạo ra, đầy và đã trở lại. Vì vậy, nếu bạn biết kích thước cần thiết (từ list.size()), bạn nên tạo mảng đủ lớn để đặt tất cả các phần tử. Trong trường hợp này, nó không được phân bổ lại.

+1

giải thích tốt về sự khác biệt giữa' chuỗi mới [0] 'và' chuỗi mới [kích thước] ' – gamliela

0

Giao diện Bộ sưu tập bao gồm phương thức toArray() để chuyển đổi bộ sưu tập mới thành một mảng. Có hai hình thức của phương pháp này. Phiên bản không có đối số sẽ trả về các phần tử của bộ sưu tập trong một mảng Object: public Object [] toArray(). Mảng trả về không thể truyền sang bất kỳ kiểu dữ liệu nào khác. Đây là phiên bản đơn giản nhất. Phiên bản thứ hai yêu cầu bạn chuyển vào loại dữ liệu của mảng bạn muốn trả về: public Object [] toArray (Object type []).

public static void main(String[] args) { 
      List<String> l=new ArrayList<String>(); 
      l.add("A"); 
      l.add("B"); 
      l.add("C"); 
      Object arr[]=l.toArray(); 
      for(Object a:arr) 
      { 
       String str=(String)a; 
       System.out.println(str); 
      } 
     } 

để tham khảo, tham khảo liên kết này http://techno-terminal.blogspot.in/2015/11/how-to-obtain-array-from-arraylist.html

0

Một cách tiếp cận sẽ có thêm lần thứ hai cho Loop nơi in ấn đang được thực hiện bên trong là người đầu tiên cho vòng lặp. Như thế này:

static String[] SENTENCE; 

public static void main(String []args) throws Exception{ 

    Scanner sentence = new Scanner(new File("assets/blah.txt")); 
    ArrayList<String> sentenceList = new ArrayList<String>(); 

    while (sentence.hasNextLine()) 
    { 
     sentenceList.add(sentence.nextLine()); 
    } 

    sentence.close(); 

    String[] sentenceArray = sentenceList.toArray(new String[sentenceList.size()]); 
    // System.out.println(sentenceArray.length); 
    for (int r=0;r<sentenceArray.length;r++) 
    { 
     SENTENCE = sentenceArray[r].split("(?<=[.!?])\\s*"); //split sentences and store in array 

     for (int i=0;i<SENTENCE.length;i++) 
     { 
      System.out.println("Sentence " + (i+1) + ": " + SENTENCE[i]); 
     } 
    }  

}