假设我有一个列表,我正在尝试在其中查找一个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;
}
}
答案 0 :(得分:8)
你拥有的不是解决方法,而是解决方案。
你可以用类似lambda的行为对它进行抽象化,这就是......但是最后,如果你试图在列表中搜索具有给定属性的元素,那么你无能为力迭代列表,直到找到具有该给定属性的元素。
如果您需要更直接地通过ID查找Acchievments,如果ID是唯一的(您说它们是),则Map<String,Achievement>
可能是更好的选择。
答案 1 :(得分:4)
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()。