Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:在排序列表中查找元素的最佳方法是什么?_Java_List_Collections_Findall_Sorted - Fatal编程技术网

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

Java:在排序列表中查找元素的最佳方法是什么?,java,list,collections,findall,sorted,Java,List,Collections,Findall,Sorted,我有一个 List<Cat> 列表 按猫的生日排序。有没有一种有效的Java Collections方法可以找到所有出生于1983年1月24日的猫?或者,一般来说,什么是好方法? 假设这些猫是按生日排序的,这将给出其中一只猫的正确生日索引。从那里,你可以前后迭代,直到你找到一个生日不同的 如果列表很长,并且/或者没有多少猫共享一个生日,那么这应该是对straight迭代的重大胜利 这是我想到的代码类型。注意,我假设一个列表;对于一个链表,你几乎被迭代所困扰。(感谢fred-o在评

我有一个

List<Cat>
列表
按猫的生日排序。有没有一种有效的Java Collections方法可以找到所有出生于1983年1月24日的猫?或者,一般来说,什么是好方法?

假设这些猫是按生日排序的,这将给出其中一只猫的正确生日索引。从那里,你可以前后迭代,直到你找到一个生日不同的

如果列表很长,并且/或者没有多少猫共享一个生日,那么这应该是对straight迭代的重大胜利

这是我想到的代码类型。注意,我假设一个列表;对于一个链表,你几乎被迭代所困扰。(感谢fred-o在评论中指出这一点。)

列出猫=…;//按生日排序
List catsWithSameBirthday=new ArrayList();
Cat钥匙=新的Cat();
关键。挫折日(…);
final int index=Collections.binarySearch(cats,key);
如果(指数<0)
每天返回相同的CATS;
catsWithSameBirthday.add(cats.get(index));
//倒退
对于(int i=index-1;i>0;i--){
if(cats.get(tmpIndex.getBirthday().equals(key.getBirthday()))
catsWithSameBirthday.add(cats.get(tmpIndex));
其他的
打破
}
//前进
对于(inti=index+1;i
二进制搜索是经典的方法

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

//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 ];
//伪代码:
索引=查找索引(日期)的二进制搜索;
如果(指数<0)
//找不到
开始=索引;
对于(;开始>=0&&cats[start].date==date;--start);
结束=索引;
对于(;end
除非您以某种方式按日期为集合编制索引,否则唯一的方法是迭代所有集合

如果您需要非常快速的搜索,请使用以生日为关键字的哈希映射。如果需要对键进行排序,请使用树形图

因为您希望允许多只猫拥有相同的生日,所以需要在Hast/TreeMap中使用集合作为值,例如

      Map<Date,Collection<Cat>>
Map

可以通过使用谓词并创建谓词与日期匹配的筛选集合来执行您想要的操作。

Collections.binarySearch()返回单个元素,并且不保证被视为相同的元素。这可能会教会我在回答之前阅读问题。:)此外,Collections.binarySearch()仅对随机访问列表有效。索引必须小于0,但是的:这是一般的想法。@Jake:好的,那不会很好。我修复了代码。Collections.binarySearch()返回单个元素,并且不保证被视为相同的元素。我没有说应该使用
Collections.binarySearch
方法。二进制搜索以查找单个元素的索引。所有其他生日相同的元素都位于找到的元素旁边。您可以通过一个循环获得所有这些。这是一个经典。@Mehrdad-更新答案以反映这一点,您将赢得一个向上投票。它按日期排序。你还可以把什么叫做索引!?我怀疑这是唯一的办法。当然,你可以想象一个“低级”算法,它可以非常有效地做到这一点,方法是找到给定生日的猫的第一次出现,然后从那里线性地进行。杰克:除非你做一些二进制搜索,否则你找到第一个元素的任何算法都将是O(n)。渐近最快的算法是二进制搜索,然后线性查找开始和结束。我本来打算提交一个答案,但由于binarySearch不能保证返回第一个结果,所以答案就消失了。它是否以O(n)过滤集合?我想它必须这样做,因为它将谓词应用于每个元素。如果对列表进行排序,则二进制搜索(如向上投票的答案)是最好的。
      Map<Date,Collection<Cat>>