Collections.binarySearch()
.
Если предположить, что кошки отсортированы по дню рождения, это даст индекс одной из кошек с правильным днем рождения. Оттуда вы можете перебирать вперед и назад, пока не достигнете одного с другим днем рождения.
Если список длинный и / или не многие кошки делят день рождения, это должно стать значительным выигрышем по сравнению с прямой итерацией.
Вот код, о котором я думаю. Обратите внимание, что я предполагаю список произвольного доступа ; для связанного списка, вы в значительной степени застряли с итерацией. (Спасибо 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;