0

假设我有一个列表,我正在尝试在其中查找一个 Class 元素,从中我只知道一个(唯一)属性。

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

您所拥有的不是解决方法,而是解决方案。

你可以用类似 lambda 的行为来抽象它,这样和那样......但最后,如果你试图在列表中搜索具有给定属性的元素,除了迭代列表,直到找到具有该给定属性的元素。

如果您需要更直接地通过 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>的,或者使用 aLinkedHashMap<String, Achievement>代替您的列表,这将实现 O(1) 搜索而不是 O(n)。

于 2012-05-09T17:49:51.813 回答
2

1) 您必须使用静态 void sort(List,Comparator) 对列表进行排序。
2) 使用静态 int binarySearch(List,Key,Comparator)。

这两个方法是 java.util.Collections

于 2012-05-09T17:54:15.737 回答
0

如果你只有一个清单,那就没什么可做的了。但是,如果这是经常做的事情,您可能需要考虑创建一个 HashMap 或类似的东西(从成就 ID 到成就)。

于 2012-05-09T17:48:36.107 回答
0

为了提高效率,您要么必须使用 idAchievement 到成就的映射,要么确保您的收藏按 idAchievement 属性排序,然后使用 Collections.binarySearch()。

于 2012-05-09T17:49:20.110 回答