2012-05-09 51 views
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

而你的问题是? “解决方法”几乎是唯一的选择,除非您打算使用[不同的数据结构](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

你有什么不是解决方法,这是解决方案。

你可以用类似lambda的行为来放弃它,而这和那......但最后,如果你想要搜索一个具有给定属性的元素的列表,那么你就无能为力,遍历列表直到找到具有该给定属性的元素。

如果您需要通过ID更直接地找到协调,如果ID是唯一的(您说他们是),Map<String,Achievement>可能是一个更好的选择。

+0

大部分正确的,只是说我正在使用一个列表,因为这是外部图书馆给我的工作。 –

+0

@EEs也值得注意Vipul的回答。我假设列表是按您想要的顺序排列的,而不是ID顺序。但是,如果您可以订购该列表,那么可以让您进行二分查找。尽管如此,排序列表的开销却很大,所以如果您可以排序一次然后再搜索多次,那么这种方法是最好的。如果您需要对每个搜索进行一次排序,这将不值得。 – yshavit

0

如果你只有一个名单有没有还有很多事情要做。但是,如果这是经常做的事情,您可能需要考虑创建一个HashMap或类似的方法(从achievementId到achievement)。

0

为了提高效率,您必须使用idAchievement Map来实现目标,或者确保您的集合按idAchievement属性排序,然后使用Collections.binarySearch()。

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)。

+0

我想将你和yshavit之间的“正确”分开,因为你的回答也是非常丰富的,但是他得到的业绩较少。无论如何,我都会喜欢你。 –

2

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

这两个方法是java.util.Collections

+0

他们对Android友善吗? –

+0

@Ff Es ....我不确定。 – Vipul