Я только начинаю работать на Java и ищу совет по хорошему способу хранения вложенных наборов данных. Например, я заинтересован в хранении данных о населении города, к которым можно получить доступ, просмотрев город в определенном состоянии. (Примечание: в конце концов, другие данные будут храниться вместе с каждым городом, это только первая попытка приступить к работе.)Что такое хорошая структура данных java для хранения вложенных элементов (например, городов в штатах)?
Текущий подход, который я использую, состоит в том, чтобы иметь объект StateList, содержащий HashMap, который хранит State Objects через строковый ключ (т. Е. HashMap < String, State >). Каждый объект состояния содержит свой собственный HashMap City Objects, на который ссылается название города (т. Е. HashMap < String, City >).
урезанная версия того, что я придумал, как это выглядит:
// TestPopulation.java
public class TestPopulation {
public static void main(String [] args) {
// build the stateList Object
StateList sl = new StateList();
// get a test state
State stateAl = sl.getState("AL");
// make sure it's there.
if(stateAl != null) {
// add a city
stateAl.addCity("Abbeville");
// now grab the city
City cityAbbevilleAl = stateAl.getCity("Abbeville");
cityAbbevilleAl.setPopulation(2987);
System.out.print("The city has a pop of: ");
System.out.println(Integer.toString(cityAbbevilleAl.getPopulation()));
}
// otherwise, print an error
else {
System.out.println("That was an invalid state");
}
}
}
// StateList.java
import java.util.*;
public class StateList {
// define hash map to hold the states
private HashMap<String, State> theStates = new HashMap<String, State>();
// setup constructor that loads the states
public StateList() {
String[] stateCodes = {"AL","AK","AZ","AR","CA","CO"}; // etc...
for (String s : stateCodes) {
State newState = new State(s);
theStates.put(s, newState);
}
}
// define method for getting a state
public State getState(String stateCode) {
if(theStates.containsKey(stateCode)) {
return theStates.get(stateCode);
}
else {
return null;
}
}
}
// State.java
import java.util.*;
public class State {
// Setup the state code
String stateCode;
// HashMap for cities
HashMap<String, City> cities = new HashMap<String, City>();
// define the constructor
public State(String newStateCode) {
System.out.println("Creating State: " + newStateCode);
stateCode = newStateCode;
}
// define the method for adding a city
public void addCity(String newCityName) {
City newCityObj = new City(newCityName);
cities.put(newCityName, newCityObj);
}
// define the method for getting a city
public City getCity(String cityName) {
if(cities.containsKey(cityName)) {
return cities.get(cityName);
}
else {
return null;
}
}
}
// City.java
public class City {
// Define the instance vars
String cityName;
int cityPop;
// setup the constructor
public City(String newCityName) {
cityName = newCityName;
System.out.println("Created City: " + newCityName);
}
public void setPopulation(int newPop) {
cityPop = newPop;
}
public int getPopulation() {
return cityPop;
}
}
Это работает для меня, но мне интересно, если есть подводные камни, которые я не столкнуться, или, если есть альтернативные/более эффективные способы, чтобы сделать то же самое.
(PS Я знаю, что мне нужно добавить еще некоторые проверки ошибок в, но сейчас я сосредоточен на том, чтобы выяснить, хорошую структуру данных.)
(Примечание: Edited изменить setPop () и getPop() для setPopulation() и getPopulation() соответственно, чтобы избежать конфуции)
Почему вы не наследуете? – user432209
Ваше решение выглядит разумным. Города - это города, поэтому вполне разумно, чтобы город был атрибутом от 0 до n государства. Кроме того, на решение может повлиять алгоритмическая или производительная проблема, но в вашем случае это не похоже. – RobertB
@ user432209 Унаследовать что? Город не является подклассом государства, он является составным членом. – RobertB