rekurencyjnych ogólnych struktur danych, takich jak mapy map, a nie wręcz zły pomysł, są często wskazujące na coś, co można naprawić - wewnętrzna mapa często może być obiektem pierwszego rzędu (który zawiera mapę), a nie tylko mapą. Nadal będziesz musiał zainicjować te wewnętrzne obiekty, ale często jest to znacznie czystszy i bardziej przejrzysty sposób rozwijania.
Na przykład, jeśli masz Map<A,Map<B,C>>
, często przechowujesz mapę od A do Thing, ale sposób w jaki jest przechowywany Thing jest przypadkowo mapą. Będziesz często uważają, że jest czystsze i łatwiej się ukryć faktu, że rzecz jest mapa, a zamiast przechowywać mapowanie Map<A,Thing>
gdzie rzeczą jest zdefiniowany jako:
public class Thing {
// Map is guaranteed to be initialized if a Thing exists
private Map<B,C> data = new Map<B,C>();
// operations on data, like get and put
// now can have sanity checks you couldn't enforce when the map was public
}
Również spojrzeć Mulitmap/Multiset użyteczności guawy, w są bardzo użyteczne w takich przypadkach, w szczególności automatycznie inicjalizują wewnętrzne obiekty. Warto zwrócić uwagę na swój przypadek, praktycznie za każdym razem, gdy zaimplementujesz Map<E, Integer>
, naprawdę chcesz Guise Multiset. Czystsze i bardziej przejrzyste.
"_... czy muszę zainicjować? _" ** Tak **. – jlordo
A HashMap z HashMaps to zwykle znak, że brakuje obiektów i enkapsulacji. –
Fajnie, mogę to docenić. Czy masz jakieś rady? Sposób w jaki o tym myślałem to posiadanie dwupoziomowego hasha, więc na przykład, gdyby to było wykrywanie spamu, mógłbym mieć "{spam: {" konto bankowe ": 3," viagra ": 9}' Jakie są twoje myśli ? –