2009-07-12 31 views
9

Nesne dizisini Vector'a dönüştürmenin en iyi yolu nedir?Java Nesne Dönüştür [] Dizi için Vektör

JDE < 1,5

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

this.elements bir nesne []

Thanks, rAyt

Ben

Hedefim platformu olan sorumu açıklamak gerekir böğürtlen.

Koleksiyonlar desteklenmiyor. Array.asList() ya değildir:/

Tam sınıfı

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; 
        } 
       } 
     }   
    }  
} 

cevap

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

Şimdi, iki kez veri kopyalama sanki görünebilir, ama değil mi. Küçük bir geçici nesne (List, asList'dan) alırsınız, ancak bu, dizinin bir görünümünü sağlar. Kopyalama yerine, okuma ve yazma işlemleri orijinal diziye geçer.

Vector ürününü genişletmek ve protected alanlarını değiştirmek mümkündür. Bu Vector, Arrays.asList yaptığı gibi dizinin bir görünümü haline sahip olmanın nispeten basit bir yol sağlar. Alternatif olarak, sadece verileri alanlara kopyalayın. Java ME için, bu, açık döngü yazmadan aldığı kadar iyidir. Test edilmemiş kod: Elbette

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

, muhtemelen bir Vector daha List ile daha iyi. 1.4 Hizmet Sonu Dönemini tamamladı. 1.5 bile EOSL döneminin çoğunu tamamladı.

+0

+1 Giden yol. – Tom

+0

Teşekkürler, Tom –

+0

hala harika bir cevap, onu oylamak için bir sebep yok! –

1
  1. kopyalama dizisi Vector elemanları veya

  2. kullanımı Arrays.asList(...), bir List döndürülecek tam olarak bir Vector değil, yine de List arayüzünü kodlamanız gerekir.

+2

Öyleyse, döngü için bir yol yok mu? –

+0

Seçenek 2'yi öneririm, çünkü bunun dizinin bir kopyasını almadığına dikkat etmek gerekir, sadece onu sarar. Seçenek 1'i önermem, yani gerçekten gerekmedikçe bir vektör kullanmayın. –

+0

@rAyt: Bunu yapmak için yerleşik bir işlev olsa bile, sahnelerin arkasında hala bir döngü kullanırdı. Sihir yok :) – bernie

2

J2ME'de, dizi üzerinde yinelenen ve öğeleri tek tek eklediğinizde sıkışmışsınız demektir. senin tek uygun seçenek imho

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

Neden Motion in Research, LoadFrom Metodu olan ancak LoadTO Yöntemi olmayan SortedReadableList gibi bir şey sağladığını anlamalı mıyım ?! :) –

1

geçerli:

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

Evet, öyle görünüyor. nesneler dizisinde 1000+ nesneleri kopyalamak için gidiyor. –

+2

Bu konuda endişe duyuyorsanız, Vector kurucusuna elements.length öğesinin bir initialCapacity öğesini atlayabilirsiniz. –

+0

@Carl: sabit, teşekkürler – dfa

1

temelde aynı şeyi yapar basitleştirilmiş karşılaştırıcı. ?

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()); 
    } 
}  

Generics'i kullanma ve: sadece

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()); 
    } 
} 

olurdu Ama sorunuzun cevabı ...(oh, Tom'un zaten koyduğum şeye sahip olduğunu görüyorum)

+0

Generics, java versiyonumda desteklenmiyor! Ama ipucu için teşekkürler +1 –