From c48e1fbc4772effe0fbe3ef6d61210a99240f280 Mon Sep 17 00:00:00 2001 From: RuleGaed Date: Fri, 15 May 2026 23:32:15 +0300 Subject: [PATCH] optimize inventory lookup with map cache Replaced O(n) linear scan in getInventory(name) with O(1) HashMap lookup. Cache is populated on inventory load and synced on delete/reload operations. --- .../fr/maxlego08/menu/ZInventoryManager.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/main/java/fr/maxlego08/menu/ZInventoryManager.java b/src/main/java/fr/maxlego08/menu/ZInventoryManager.java index 871eb014..3c4e48aa 100644 --- a/src/main/java/fr/maxlego08/menu/ZInventoryManager.java +++ b/src/main/java/fr/maxlego08/menu/ZInventoryManager.java @@ -91,6 +91,7 @@ public class ZInventoryManager extends ZUtils implements InventoryManager { private final Map playerPages = new HashMap<>(); private final Map playerMaxPages = new HashMap<>(); + private final Map inventoryByName = new HashMap<>(); private final List inventoryLoadRequirements = new ArrayList<>(); @@ -210,6 +211,7 @@ public Inventory loadInventory(Plugin plugin, File file, Class inventories = this.inventories.getOrDefault(plugin.getName(), new ArrayList<>()); inventories.add(inventory); this.inventories.put(plugin.getName(), inventories); + this.inventoryByName.put(inventory.getFileName().toLowerCase(), inventory); if (Configuration.enableInformationMessage) { Logger.info(file.getPath() + " loaded successfully !", LogType.INFO); @@ -240,12 +242,7 @@ public Optional getInventory(String name) { if (name == null) { return Optional.empty(); } - for (Inventory inventory : this.getInventories()) { - if (inventory.getFileName().equalsIgnoreCase(name)) { - return Optional.of(inventory); - } - } - return Optional.empty(); + return Optional.ofNullable(this.inventoryByName.get(name.toLowerCase())); } @Override @@ -287,6 +284,7 @@ public void deleteInventory(Inventory inventory) { List inventories = this.inventories.getOrDefault(pluginName, new ArrayList<>()); inventories.remove(inventory); this.inventories.put(pluginName, inventories); + this.inventoryByName.remove(inventory.getFileName().toLowerCase()); } @Override @@ -301,7 +299,10 @@ public boolean deleteInventory(String name) { @Override public void deleteInventories(Plugin plugin) { - this.inventories.remove(plugin.getName()); + List removed = this.inventories.remove(plugin.getName()); + if (removed != null) { + removed.forEach(inv -> this.inventoryByName.remove(inv.getFileName().toLowerCase())); + } } @Override @@ -474,6 +475,7 @@ public void loadInventories() { this.playerMaxPages.clear(); this.playerPages.clear(); + this.inventoryByName.clear(); File folder = new File(this.plugin.getDataFolder(), "inventories"); if (!folder.exists()) {