Dobre praktyki tworzenia słowników w Javie

0

Czym się posługiwać przy tworzeniu słowników w Javie? HashMapem? LinkedListem? a może enumem?

Załóżmy, że mamy 1000 województw z całego świata. Nazwy są stałe i przypisane do nich inty również. Jak zrobić słownik by na wskazane województwo otrzymywać wartość przypisaną do województwa?

Zrobiłem to na 2 sposoby, weźcie mnie poprawcie:

sposob 1: enumem:

 


// slownik -------------------------------------------------------------------------------------------------------------------------------

public enum Slownik {
	SLASKIE(54), WIELKOPOLSKIE(49), OKSYTANIA(15), NORMANDIA(13), SYBERIA(80);

	private int x;

	Slownik(int x) {
		this.x = x;
	}

	int getX() {
		return x;
	}

}



// jedziemy z koksem ----------------------------------------------------------------------

public class Odleglosc {
	public static void main(String args[]) {

		String[] przypadki = { "NORMANDIA", "SYBERIA", "TROLOLOLO" };
		int[] przypadkiWartosci = new int[3];

		for (int i = 0; i < przypadki.length; i++) {
			for (Slownik b : Slownik.values()) {
				if (przypadki[i].equals(b.name())) {
					przypadkiWartosci[i] = b.getX();
				}
			}
		}

		for (int a : przypadkiWartosci) {
			System.out.println(a);
		}

	}
}

sposób 2: HashMapem:

import java.util.HashMap;


// slownik -------------------------------------------------------------------------------------------------------------------------------
public class Slownik {

	public static final HashMap<String, Integer> hmap = new HashMap<>();

	static {
		hmap.put("SLASKIE", 54);
		hmap.put("WIELKOPOLSKIE", 49);
		hmap.put("OKSYTANIA", 15);
		hmap.put("NORMANDIA", 13);
		hmap.put("SYBERIA", 80);
	}

	public int get(Object key) {
		return hmap.get(key);
		// System.out.println();
	}

}

import java.util.HashMap;


// jedziemy z koksem ----------------------------------------------------------------------

public class Odleglosc {
	public static void main(String args[]) {
		Slownik s = new Slownik();

		String[] przypadki = { "NORMANDIA", "SYBERIA", "TROLOLOLO" };
		int[] przypadkiWartosci = new int[3];

		for (int i = 0; i < przypadki.length; i++) {
			try {
				przypadkiWartosci[i] = s.get(przypadki[i]);
			} catch (NullPointerException e) {
				System.out.println("oj oj oj nie znaleziono w slowniku wojewodztwa: " + przypadki[i]);
			}
		}

		for (int a : przypadkiWartosci) {
			System.out.println(a);
		}
	}
}
0

Ze względu na ilość elementów, którą podałeś użyłbym Map. Instancja tworzona byłaby na podstawie danych z zewnętrznego źródła (pliku, bazy danych, etc.). W przypadku mniejszej liczby elementów użyłbym "statycznego" typu wyliczeniowego.

O ile rozumiem co chcesz osiągnąć typem Slownik to gubię się już trochę przy Odleglosc - do czego ten typ ma służyć?

1

Jeżeli słownik jest stały, czyli nie pobieramy wartości z bazy, pliku, czy ogólnie zakładamy że zmienia się na tyle rzadko że każda zmiana wymagała będzie zmiany źródeł, to jest to idealne miejsce do użycia enum. Ilość elementów nie ma tutaj znaczenia. Dzięki temu mamy sprawdzanie w czasie kompilacji i bardzo szybkie kolekcje EnumSet/EnumMap.

1 użytkowników online, w tym zalogowanych: 0, gości: 1