0

リストがあり、その中のClass要素を検索しようとしているとします。このリストから、1つの(一意の)属性しかわかりません。

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

5 に答える 5

8

あなたが持っているのは回避策ではなく、解決策です。

ラムダのような振る舞いでそれを抽象化することもできますし、あれもこれも... しかし、最終的に、特定の属性を持つ要素のリストを検索しようとしている場合、できることは何もありません。その特定の属性を持つ要素が見つかるまでリストします。

ID で実績をより直接的に検索する必要があるMap<String,Achievement>場合、ID が一意である場合は a の方が適している可能性があります (一意であると言えます)。

于 2012-05-09T17:49:08.750 に答える
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)検索を実行することもできます。

于 2012-05-09T17:49:51.813 に答える
2

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

これらの 2 つのメソッドは、java.util.Collections のものです。

于 2012-05-09T17:54:15.737 に答える
0

リストしかない場合は、他にやることはあまりありません。ただし、これが頻繁に行われる場合は、代わりに HashMap などを作成することを検討することをお勧めします (achievementId から achievement まで)。

于 2012-05-09T17:48:36.107 に答える
0

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

于 2012-05-09T17:49:20.110 に答える