2

配列から選択したオブジェクトを取得する最速の方法は何ですか?

MyObject[] objects = new MyObject[]{new MyObject(true), new MyObject(false)};
MyObject[] selectedObjects = ???

次よりも速い方法はありますか?

ArrayList<MyObject> selObjectsList = new ArrayList<MyObject>();
for(MyObject obj : objects){
   if(obj.isSelected()){
       selObjectsList.add(obj);
   }
}
selectedObjects = selObjectsList.toArray(new MyObject[0]);

これは単純な操作の多くの行ですが、同じことを行うためのより短い操作はありますか?

4

3 に答える 3

3

標準ライブラリでは、(基本的に) きちんとした方法はありません。filterしかし、持っているかpredicateサポートしているサードパーティのライブラリは数多くあります。Google コレクションが思い浮かびます。また、 LambdaJについても良いことを聞いています。願わくば、Java 8 で状況が改善されることを願っています!

LambdaJ を使用すると、次のようになります。

select(myList, having(on(MyObject.class).isSelected()));

編集「最速」を最短の行数と解釈しました。あなたが考えていたパフォーマンスであれば、この答えは適切ではないかもしれません。

于 2013-04-15T11:37:31.910 に答える
0

残念だけど違う。線形リストである ArrayList を使用している場合は、効果的に線形検索を強制しています。

ルックアップを改善したい場合は、より迅速なルックアップを可能にする Map のようなものを使用できますが、キーを設定するためのインテリジェントな方法を使用する必要があります。たとえば、注文を検索する場合、注文番号をキーとして使用できます。

于 2013-04-15T11:41:06.523 に答える
0

マップを使用します。

  Map<Boolean, List<MyObject>> someMap;

次に、以下を実行して、選択されている「MyObjects」のリストを取得できます。

  someMap.get(true); 

そして人口を増やすには...

  someMap.put(myObjectInstance.isSelected(), myObjectInstance);
于 2013-04-15T11:41:34.787 に答える