У меня есть класс по линии:
public class Observation {
private String time;
private double x;
private double y;
//Constructors + Setters + Getters
}
Я могу выбрать для хранения этих объектов в любом типе коллекции (Стандартный класс или третье лицо, например, Гуава). Я сохранил некоторые примерные данные в ArrayList ниже, но, как я уже сказал, я открыт для любого другого типа коллекций, которые справятся с задачей. Итак, некоторые примеры данных:
ArrayList<Observation> ol = new ArrayList<Observation>();
ol.add(new Observation("08:01:23",2.87,3.23));
ol.add(new Observation("08:01:27",2.96,3.17));
ol.add(new Observation("08:01:27",2.93,3.20));
ol.add(new Observation("08:01:28",2.93,3.21));
ol.add(new Observation("08:01:30",2.91,3.23));
В примере предполагается наличие соответствующего конструктора в Observation
. Метки времени хранятся в виде String
объектов, поскольку я получаю их как таковые из внешнего источника, но я рад преобразовать их во что-то другое. Я получаю наблюдения в хронологическом порядке, чтобы я мог создавать и полагаться на отсортированную коллекцию наблюдений. Метки времени НЕ являются уникальными (как видно из данных примера), поэтому я не могу создать уникальный ключ на основе time
.
Теперь к проблеме. Мне часто нужно найти одно (1) наблюдение с time
равным или близким к определенному времени, например, если мое время было 08:01:29
, я хотел бы получить 4-е наблюдение в данных примера и если время 08:01:27
Я хочу третье наблюдение.
Я, очевидно, могу перебирать коллекцию, пока не найду нужное время, но мне нужно делать это часто, и в конце дня у меня могут быть миллионы наблюдений, поэтому мне нужно найти решение, где я может найти соответствующие наблюдения эффективным способом.
Я рассмотрел различные типы коллекций, в том числе те, в которых я могу фильтровать коллекции с помощью Predicates
, но мне не удалось найти решение, которое возвратило бы одно значение, в отличие от подмножества коллекции, которое удовлетворяет "< = "- состояние. По сути, я ищу SQL эквивалент SELECT * FROM ol WHERE time <= t LIMIT 1
.
Я уверен, что есть разумный и простой способ решить мою проблему, поэтому я надеюсь быть просветленным. Заранее спасибо.