2009-07-12 38 views
9

オブジェクト配列をベクトルに変換する最適な方法は何ですか?オブジェクトをJavaに変換するベクトルをベクトルに変換する

JDE < 1.5

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

this.elements、オブジェクト[]

おかげで、 rAyt

私は

私のターゲットプラットフォームがある私の質問を明確にすべきですブラックベリー。

コレクションはサポートされていません。 Array.asListは()のいずれか、ではありません:/

全クラス

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

答えて

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

さて、それはあなたが2倍のデータをコピーしているかのように見えるかもしれませんが、あなたはそうではありません。 1つの小さな一時オブジェクト(ListからasListまで)を取得しますが、これは配列のビューを提供します。コピーする代わりに、読み書き操作は元の配列に行きます。

Vectorを拡張して、protectedフィールドを突き出すことができます。これにより、のように、Vectorを配列のビューにする比較的簡単な方法が得られます。あるいは、フィールドにデータをコピーするだけです。 Java MEの場合、これは明白なループを書かずに得られるものとほぼ同じです。未テストコード:もちろん

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

、あなたはおそらくVectorよりListとオフに優れています。 1.4はサービス終了期間を終了しました。 1.5でもEOSL期間の大部分を完了している。

+0

+1行く方法。 – Tom

+0

ありがとう、トム –

+0

まだ素晴らしい答え、彼を投票する理由はありません! –

1
  1. コピーVector、または

  2. 使用Arrays.asList(...)に配列要素Listを返すために、どのとにかくListインターフェイスをコーディングする必要があります。Vector

+2

forループの周りにはない? –

+0

私はオプション2を提案しますが、これは配列のコピーを取らず、ラップするだけです。私はオプション1を提案しません。本当に必要な場合を除き、ベクターを使用しないでください。 –

+0

@rAyt:これを行う組み込み関数があったとしても、その場ではfor-loopを使います。魔法はありません:) – bernie

2

J2MEでは、配列を反復処理して要素を1つずつ追加します。あなたの唯一の実行可能な選択肢私見

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

Research in Motionが、LoadFromメソッドを持ちますが、LoadTOメソッドを持たないSortedReadableListのようなものを提供する理由を理解する必要がありますか? :) –

1

は次のとおりです。

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

ええ、そんな感じです。オブジェクト配列内の1000個以上のオブジェクトのコピーを吸うようになります。 –

+2

もしあなたが心配しているのであれば、elements.lengthのinitialCapacityをVectorコンストラクタに投げることができます。 –

+0

@Carl:固定、ありがとう – dfa

1

基本的に同じことを単純化したコンパレータ。 ?

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

ジェネリック医薬品を使用すると:それはちょうど

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

だろう。しかし、あなたの質問に答えるために...(ああ、トムは私がすでに置いたものを持っているのを見る)

+0

ジェネリックは私のJavaバージョンではサポートされていません。しかし、ヒント+1のおかげで –

関連する問題