Как эффективно возвращать значения карты, используя только часть ключа/идентификатора (составного)? ⇐ JAVA
Как эффективно возвращать значения карты, используя только часть ключа/идентификатора (составного)?
Я создаю составной ключ, состоящий из двух частей: mainId ивторичныйId. Я хочу иметь возможность использовать обе части, когда мне нужно вставить значение. Однако мне хотелось бы иметь возможность получать значение двумя способами: 1) использовать обе части для возврата только одного значения; 2) использование только mainId для возврата списка значений, имеющих этот mainId.
Я реализовал 2) в приведенном ниже коде. Однако это не выглядит эффективным. Есть ли лучший способ сделать это?
Большое спасибо!
import java.util.ArrayList; импортировать java.util.List; импортировать java.util.Map; импортировать java.util.HashMap; общественный класс Main { public static void main(String[] args) { Map карта = новый HashMap(); map.put(new CompositeId("1", "1"), "val1"); map.put(new CompositeId("1", "1"), "val2"); map.put(new CompositeId("1", "2"), "val3"); map.put(new CompositeId("2", "1"), "val4"); // есть ли способ сделать это более эффективно? // List listValsWithMainIdEqualsOne = новый ArrayList(); List listIdsWithMainIdEqualsOne = map.keySet().stream().filter(k -> k.getMainId().equals("1")).toList(); listIdsWithMainIdEqualsOne.forEach(k -> listValsWithMainIdEqualsOne.add(map.get(k))); /////////////////////////////////////////////////// Assert Map.get(новый CompositeId("1", "1")).equals("val2"); Assert Map.get(новый CompositeId("1", "2")).equals("val3"); утверждать listValsWithMainIdEqualsOne.contains("val2"); утвердить listValsWithMainIdEqualsOne.contains("val3"); } } класс CompositeId { частная строка mainId; частная строка вторичного идентификатора; public CompositeId (String mainId, String SecondaryId) { this.mainId = mainId; this. SecondaryId = SecondaryId; } @Override общедоступное логическое значение равно (Объект o) { if (this == o) возвращает true; if (o == null || getClass() != o.getClass()) возвращает false; CompositeId complexId = (CompositeId) o; if (!this.mainId.equals(compositeId.getMainId())) возвращает false; if (compositeId.getSecondaryId() != null && !this. SecondaryId.equals(compositeId.getSecondaryId()))) возвращает false; вернуть истину; } @Override общественный int hashCode() { return (mainId + вторичныйId).hashCode(); } публичная строка getMainId() { вернуть основной идентификатор; } публичная строка getSecondaryId() { вернуть вторичный идентификатор; } }
Я создаю составной ключ, состоящий из двух частей: mainId ивторичныйId. Я хочу иметь возможность использовать обе части, когда мне нужно вставить значение. Однако мне хотелось бы иметь возможность получать значение двумя способами: 1) использовать обе части для возврата только одного значения; 2) использование только mainId для возврата списка значений, имеющих этот mainId.
Я реализовал 2) в приведенном ниже коде. Однако это не выглядит эффективным. Есть ли лучший способ сделать это?
Большое спасибо!
import java.util.ArrayList; импортировать java.util.List; импортировать java.util.Map; импортировать java.util.HashMap; общественный класс Main { public static void main(String[] args) { Map карта = новый HashMap(); map.put(new CompositeId("1", "1"), "val1"); map.put(new CompositeId("1", "1"), "val2"); map.put(new CompositeId("1", "2"), "val3"); map.put(new CompositeId("2", "1"), "val4"); // есть ли способ сделать это более эффективно? // List listValsWithMainIdEqualsOne = новый ArrayList(); List listIdsWithMainIdEqualsOne = map.keySet().stream().filter(k -> k.getMainId().equals("1")).toList(); listIdsWithMainIdEqualsOne.forEach(k -> listValsWithMainIdEqualsOne.add(map.get(k))); /////////////////////////////////////////////////// Assert Map.get(новый CompositeId("1", "1")).equals("val2"); Assert Map.get(новый CompositeId("1", "2")).equals("val3"); утверждать listValsWithMainIdEqualsOne.contains("val2"); утвердить listValsWithMainIdEqualsOne.contains("val3"); } } класс CompositeId { частная строка mainId; частная строка вторичного идентификатора; public CompositeId (String mainId, String SecondaryId) { this.mainId = mainId; this. SecondaryId = SecondaryId; } @Override общедоступное логическое значение равно (Объект o) { if (this == o) возвращает true; if (o == null || getClass() != o.getClass()) возвращает false; CompositeId complexId = (CompositeId) o; if (!this.mainId.equals(compositeId.getMainId())) возвращает false; if (compositeId.getSecondaryId() != null && !this. SecondaryId.equals(compositeId.getSecondaryId()))) возвращает false; вернуть истину; } @Override общественный int hashCode() { return (mainId + вторичныйId).hashCode(); } публичная строка getMainId() { вернуть основной идентификатор; } публичная строка getSecondaryId() { вернуть вторичный идентификатор; } }
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение