我有一个
List<Cat>
按照猫的生日排序。是否有一种有效的Java Collections方法可以找到1983年1月24日出生的所有猫?或者,一般来说什么是好方法?
答案 0 :(得分:9)
假设猫按生日分类,这将给出其中一只猫的生日正确指数。从那里开始,你可以向后和向前迭代,直到你遇到一个生日不同的人。
如果列表很长和/或没有多少猫分享生日,这应该是直接迭代的重大胜利。
这是我正在考虑的那种代码。请注意,我假设random-access列表;对于链表,你几乎坚持迭代。 (感谢fred-o在评论中指出这一点。)
List<Cat> cats = ...; // sorted by birthday
List<Cat> catsWithSameBirthday = new ArrayList<Cat>();
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;
答案 1 :(得分:8)
二元搜索是经典的方式。
澄清:我说你使用二进制搜索。没有一个具体的方法。算法是:
//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 ];
答案 2 :(得分:3)
Google Collections可以通过使用谓词并创建谓词匹配日期的过滤集合来执行您想要的操作。
答案 3 :(得分:0)
除非你以某种方式按日期索引集合,否则唯一的方法是遍历所有这些
答案 4 :(得分:0)
如果您需要非常快速的搜索,请使用带有生日的HashMap作为密钥。如果需要对键进行排序,请使用TreeMap。
因为您希望允许多只猫拥有相同的生日,所以您需要将一个Collection用作Hast / TreeMap中的值,例如
Map<Date,Collection<Cat>>