Вы можете улучшить это, упорядочив список категорий, чтобы мы могли выполнить двоичный поиск, чтобы найти даты.Здесь предполагается, что для категорий для одной и той же ценной бумаги не существует перекрывающихся дат.
Для этого мы собираемся создать компаратор, который будет соответствовать любым категориям активов, которые имеют пересечение.
public class IntersectComparator implements Comparator<AssetCategory> {
public int compare(AssetCategory l, AssetCategory r) {
if (l.getEnd().isBefore(r.getStart())) {
return -1;
}
if (r.getEnd().isBefore(l.getStart())) {
return 1;
}
return 0;
}
}
Это позволяет нам как вычислить позицию вставки, так и выполнить двоичный файлsearch.
public class AssetCategories {
private final static Comparator<AssetCategory> COMPARATOR = new IntersectComparator();
private Map<String, List<AssetCategory>> assets = new HashMap<>();
public void add(AssetCategory assetCategory) {
List<AssetCategory> categories = assets.computeIfAbsent(assetCategory.getAsset(), k -> new ArrayList<>());
int insert = Collections.binarySearch(categories, assetCategory, COMPARATOR);
if (insert >= 0) {
throw new IllegalArgumentException("Asset category dates intersect with existing asset category");
}
categories.add(-insert - 1, assetCategory);
}
public AssetCategory fetchAssetCategory(String asset, LocalDate date) {
List<AssetCategory> categories = assets.get(asset);
if (categories == null) {
return null;
}
int index = Collections.binarySearch(categories,
new AssetCategory(asset, "SEARCH", date, date),
COMPARATOR);
return index < 0 ? null : categories.get(index);
}
public boolean validateAssetCategory(String asset, String category, LocalDate date) {
AssetCategory assetCategory = fetchAssetCategory(asset, date);
return assetCategory != null && assetCategory.getCategory().equalsIgnoreCase(category);
}
}
И вы бы использовали его следующим образом:
AssetCategories categories = new AssetCategories();
categories.add(new AssetCategory("AAPL", "US LARGE CAP VALUE", LocalDate.parse("2015-01-01"), LocalDate.parse("2015-02-17")));
categories.add(new AssetCategory("AAPL", "US LARGE CAP GROWTH", LocalDate.parse("2015-02-18"), LocalDate.parse("2015-03-16")));
categories.add(new AssetCategory("AAPL", "US MID CAP VALUE", LocalDate.parse("2015-08-18"), LocalDate.parse("2015-12-15")));
categories.add(new AssetCategory("AAPL", "US LARGE CAP VALUE", LocalDate.parse("2015-03-17"), LocalDate.parse("2015-05-17")));
categories.add(new AssetCategory("AAPL", "US MID CAP GROWTH", LocalDate.parse("2015-05-18"), LocalDate.parse("2015-08-17")));
AssetCategory assetCategory = categories.fetchAssetCategory("AAPL", LocalDate.parse("2015-12-14"));
boolean valid = categories.validateAssetCategory("AAPL", "US MID CAP VALUE", LocalDate.parse("2015-12-15"));
Хотя это похоже на курсовую работу, поэтому ваш лектор может искать для вас карту деревьев в качествеструктура данных.