2009-07-12 41 views
9

Cách tốt nhất để chuyển đổi mảng Object thành Vector là gì?Java Convert Object [] Array to Vector

JDE < 1,5

public Vector getListElements() 
{ 
    Vector myVector = this.elements; 
    return myVector; 
} 

this.elements là một Object []

Cảm ơn, rAyt

Tôi nên làm rõ câu hỏi của tôi

nền tảng mục tiêu của tôi là một blackberry.

Bộ sưu tập không được hỗ trợ. Array.asList() không phải là, một trong hai:/

Full Lớp

package CustomElements; 

import net.rim.device.api.ui.component .*; 
import net.rim.device.api.collection.util.*; 
import net.rim.device.api.util.*; 
import java.util.*; 

public class ContactsList extends SortedReadableList implements KeywordProvider 
{ 
    // Constructor 
    public ContactsList(Vector contacts) 
    { 
     super(new ContactsListComparatorByFirstName());  
     loadFrom(contacts.elements());  
    } 
    // Add Element to ContactsSortedReadableList 
    void addElement(Object element) 
    { 
     doAdd(element); 
    } 

    public Vector getListElements() 
    { 
     return new Vector(Collection 


     Vector test = this.getElements(); 
    } 
    // getKeywords 
    public String[] getKeywords(Object element) 
    { 
     return StringUtilities.stringToWords(((Contact)element).get_contactFirstName()); 
     // return StringUtilities.stringToWords(element.toString()); 
    } 
    // Comparator sorting Contact objects by name 
    final static class ContactsListComparatorByFirstName implements Comparator 
    {       
     public int compare(Object o1, Object o2) 
     { 
      // Sticky Entries Implementation 
      if(((ContactsListObject)o2).getSticky()) 
      { 
       return 1; 
      } else 
       if (((ContactsListObject)o1).getSticky()) 
       { 
        return -1; 
       } else 
       { 
        if(((ContactsListObject)o1).get_contactFirstName().compareTo(((ContactsListObject)o2).get_contactFirstName()) <0) 
        { 
         return -1; 
        } 
        if(((ContactsListObject)o1).get_contactFirstName().compareTo(((ContactsListObject)o2).get_contactFirstName()) >0) 
        { 
         return 1; 
        } 
        else 
        { 
         return 0; 
        } 
       } 
     }   
    }  
} 

Trả lời

35
return new Vector(Arrays.asList(elements)); 

Bây giờ, nó có thể trông như thể bạn đang sao chép dữ liệu hai lần, nhưng bạn thì không. Bạn nhận được một vật thể tạm thời nhỏ (một List từ asList), nhưng điều này cung cấp một cái nhìn của mảng. Thay vì sao chép nó, các hoạt động đọc và ghi đi qua mảng ban đầu.

Có thể mở rộng Vector và poke các trường protected của nó. Điều này sẽ đưa ra một cách tương đối đơn giản để có được Vector trở thành một khung nhìn của mảng, như là Arrays.asList. Ngoài ra, chỉ cần sao chép dữ liệu vào các trường. Đối với Java ME, đây là về tốt như nó được mà không cần viết vòng lặp rõ ràng. đang chưa được kiểm tra:

return new Vector(0) {{ 
    this.elementData = (Object[])elements.clone(); 
    this.elementCount = this.elementData.length; 
}}; 

Tất nhiên, bạn có lẽ tốt hơn với một List hơn một Vector. 1.4 đã hoàn thành giai đoạn End of Service Life. Ngay cả 1.5 đã hoàn thành phần lớn thời gian EOSL của nó.

+0

+1 Con đường để đi. – Tom

+0

Cảm ơn, Tom –

+0

vẫn là câu trả lời hay, không có lý do gì để bỏ phiếu cho anh ấy! –

1
  1. Sao chép các phần tử mảng đến Vector, hoặc

  2. Sử dụng Arrays.asList(...) để trả về một List, mà không chính xác là Vector, nhưng bạn vẫn nên mã hóa giao diện List.

+2

Vì vậy, không có cách nào xung quanh vòng lặp for? –

+0

Tôi đề nghị lựa chọn 2 ngoại trừ việc lưu ý rằng điều này không lấy một bản sao của mảng, nó chỉ kết thúc tốt đẹp nó. Tôi sẽ không đề nghị lựa chọn 1 tức là không sử dụng một vector trừ khi bạn thực sự cần. –

+0

@rAyt: Ngay cả khi có một chức năng tích hợp để làm như vậy, nó vẫn sẽ sử dụng một vòng lặp phía sau hậu trường. Không có phép thuật :) – bernie

2

Trong J2ME, bạn bị kẹt lặp lại trên mảng và thêm từng phần tử.

Vector v = new Vector(); 
for (int i = 0; i < this.elements.length; i++) { 
    v.add(this.elements[i]); 
} 
+0

Tôi có nên hiểu tại sao Research in Motion cung cấp một cái gì đó như SortedReadableList có phương thức LoadFrom, nhưng không có phương pháp LoadTO ?! :) –

1

IMHO lựa chọn khả thi duy nhất của bạn là:

public Vector getListElements() 
    Vector vector = new Vector(this.elements.length); 

    for (int i = 0; i < this.elements.length; i++) { 
     vector.add(this.elements[i]); 
    } 

    return vector; 
} 
+0

Vâng, có vẻ như vậy. sẽ hút sao chép 1000 đối tượng trong mảng đối tượng. –

+2

Nếu bạn quan tâm đến nó, bạn có thể quăng trong một InitialCapacity của elements.length đến Vector constructor. –

+0

@Carl: cố định, cảm ơn – dfa

1

Một so sánh đơn giản mà không về cơ bản là giống nhau.

final static class ContactsListComparatorByFirstName implements Comparator { 
    public int compare(Object o1, Object o2) { 
      // Sticky Entries Implementation 
     ContactsListObject clo2 = (ContactsListObject) o2; 
     ContactsListObject clo1 = (ContactsListObject) o1; 
     if (clo2.getSticky()) return 1; 
     if (clo1.getSticky()) return -1; 
     return clo1.get_contactFirstName().compareTo(clo2.get_contactFirstName()); 
    } 
}  

Sử dụng Generics và: nó sẽ chỉ

static final class ContactsListComparatorByFirstName implements Comparator<ContactsListObject> { 
    public int compare(ContactsListObject clo1, ContactsListObject clo2) { 
     return clo2.getSticky() ? 1 : // Sticky Entries Implementation 
      clo1.getSticky() ? -1 : 
      clo1.get_contactFirstName().compareTo(clo2.get_contactFirstName()); 
    } 
} 

Nhưng để trả lời câu hỏi của bạn ...(oh tôi thấy Tom có ​​những gì tôi đã đặt)

+0

Generics không được hỗ trợ trong phiên bản java của tôi! Nhưng cảm ơn gợi ý +1 –