2012-05-09 9 views
0

私はリストを持っており、そこにクラス要素をルックアップしようとしていますが、そこからは(ユニークな)属性しか知りません。リストを検索する

public static List<Achievement> listAchievements; 
String idAchievement = "5764e35"; 

これは明らかに

listAchievements.indexOf(idAchievement); 

を作業していないどちらもこの

Achievement ach(idAchievement); 
listAchievements.getIndexOf(ach); 

であり、あなたはそこだけではありませんリストを持っている場合、回避策は

for (Achievement achievement : listAchievements) { 
     if (achievement.resourceID().equalsIgnoreCase(idAchievement)) { 
      // STUFF 
      break; 
     } 
    } 
+4

あなたの質問は? [回避策]は、[異なるデータ構造](http://docs.oracle.com/javase/7/docs/api/java/util/Map.html)を使用することができない限り、唯一の選択肢です。 )。 –

+0

javaのListインターフェイスにgetIndexOf(Object obj)メソッドがあるのだろうかと思います。 – dharam

+0

正しいメソッド名はindexOfです。http://docs.oracle.com/javase/1.4.2/docs/api/java/util/List.html#indexOf%28java.lang.Object%29 –

答えて

8

回避策ではありませんが解決策です。

ラムダのような振る舞いでこれを抽象化することはできますが、最終的に、特定の属性を持つ要素のリストを検索しようとすると、何もできません指定された属性を持つ要素が見つかるまでリストを反復処理します。

IDで直接取得する必要がある場合は、IDが一意のIDであればMap<String,Achievement>を選択するとよいでしょう。

+0

ほとんど正しいです。私はリストを使用していました。なぜなら、これは外部ライブラリが私に働きかけてくれたからです。 –

+0

@EfEs Vipulの答えも注目に値する。私はリストがあなたが望む順序であったと仮定していました。これはIDオーダーではありません。しかし、あなたがリストを注文することができれば、バイナリ検索に至ることができます。ただし、リストをソートする際のオーバーヘッドがあります。このアプローチは、一度ソートしてから複数回検索することができれば最善です。検索ごとに並べ替えを行う必要がある場合、それは価値がないでしょう。 – yshavit

0

きれいではありませんされていませんはるかに多くのこと。しかし、これが頻繁に行われていることであれば、代わりに達成目標から成果までHashMapなどを作成することを検討してください。

0

このように効率を上げるには、IdAchievement of Achievementのマップを使用するか、コレクションがidAchievement属性でソートされていることを確認してからCollections.binarySearch()を使用する必要があります。

4

あなたが探しているものを見つけるまで、要素をループする以外に方法はありません。 Guavaの述語のサポートは、

Achievement a = Iterables.find(list, new Predicate<Achievement>() { 
    @Override 
    public boolean apply(Achievement input) { 
     return input.resourceID().equalsIgnoreCase(idAchievement) 
    } 
}); 

ですが、最終結果は同じです。

あなたのリストに加えてMap<String, Achievement>を維持するか、リストの代わりにLinkedHashMap<String, Achievement>を使用すると、O(n)の代わりにO(1)検索が実現します。

+0

あなたの答えは非常に有益なので、私はあなたとyshavitの間の "正しい"を分割したいが、彼は少ないカルマを持っているので、彼はそれを取得します。あなたはとにかくあなたをアップアップします。 –

2

1)静的void sort(List、Comparator)を使用してリストをソートする必要があります。
2)static int binarySearch(List、Key、Comparator)を使用します。

これら2つの方法はjava.util.Collectionsです

+0

これらはAndroid対応ですか? –

+0

@Ff Es ....私はそれについては分かりません。 – Vipul

関連する問題