搜索列表

时间:2012-05-09 17:45:09

标签: java

假设我有一个列表,我正在尝试在其中查找一个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;
        }
    }

5 个答案:

答案 0 :(得分:8)

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

你可以用类似lambda的行为对它进行抽象化,这就是......但是最后,如果你试图在列表中搜索具有给定属性的元素,那么你无能为力迭代列表,直到找到具有该给定属性的元素。

如果您需要更直接地通过ID查找Acchievments,如果ID是唯一的(您说它们是),则Map<String,Achievement>可能是更好的选择。

答案 1 :(得分: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(1)搜索而不是O(n)。

答案 2 :(得分:2)

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

这两个方法是java.util.Collections

答案 3 :(得分:0)

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

答案 4 :(得分:0)

为了提高效率,你要么必须使用idAchievement的Map to Achievement,要么确保你的集合按idAchievement属性排序,然后使用Collections.binarySearch()。