当前位置:  开发笔记 > 编程语言 > 正文

Java:在排序列表中查找元素的最佳方法是什么?

如何解决《Java:在排序列表中查找元素的最佳方法是什么?》经验,为你挑选了2个好方法。

我有一个

List

按猫的生日排序.是否有一种有效的Java Collections方法可以找到1983年1月24日出生的所有猫?或者,一般来说什么是好方法?



1> Michael Myer..:

Collections.binarySearch().

假设猫按生日分类,这将给出其中一只猫的生日正确指数.从那里开始,你可以向前和向后迭代,直到你遇到一个生日不同的人.

如果列表很长和/或没有多少猫共享生日,这应该是直接迭代的重大胜利.

这是我正在考虑的那种代码.请注意,我假设一个随机访问列表; 对于链表,你几乎坚持迭代.(感谢fred-o在评论中指出这一点.)

List cats = ...; // sorted by birthday
List catsWithSameBirthday = new ArrayList();
Cat key = new Cat();
key.setBirthday(...);
final int index = Collections.binarySearch(cats, key);
if (index < 0)
    return catsWithSameBirthday;
catsWithSameBirthday.add(cats.get(index));
// go backwards
for (int i = index-1; i > 0; i--) {
    if (cats.get(tmpIndex).getBirthday().equals(key.getBirthday()))
        catsWithSameBirthday.add(cats.get(tmpIndex));
    else
        break;
}
// go forwards
for (int i = index+1; i < cats.size(); i++) {
    if (cats.get(tmpIndex).getBirthday().equals(key.getBirthday()))
        catsWithSameBirthday.add(cats.get(tmpIndex));
    else
        break;
}
return catsWithSameBirthday;



2> Mehrdad Afsh..:

二进制搜索是经典的方法.

澄清:我说过你使用二进制搜索.没有一个具体的方法.算法是:

//pseudocode:

index = binarySearchToFindTheIndex(date);
if (index < 0) 
  // not found

start = index;
for (; start >= 0 && cats[start].date == date; --start);
end = index;
for (; end < cats.length && cats[end].date == date; ++end);

return cats[ start .. end ];

推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有