我想知道,在Java中创建变量的最佳方法是什么。用一些静态数据创建变量的最佳方法
我有国家的状态,一些int和一些其他INT:
USA -> {{"NY", 100, 100},{"CO", 200, 200},...}
CAN -> {{"Quebec", 100, 100} ...}
有一些国家。我知道我需要创建类,在那里我会把这些数据(状态,整数,整数),但后来我会提供国家和只有这个国家的数据。数据不会改变。
我应该把所有东西都放到一个静态变量中,还是分成不同的变量?
我想知道,在Java中创建变量的最佳方法是什么。用一些静态数据创建变量的最佳方法
我有国家的状态,一些int和一些其他INT:
USA -> {{"NY", 100, 100},{"CO", 200, 200},...}
CAN -> {{"Quebec", 100, 100} ...}
有一些国家。我知道我需要创建类,在那里我会把这些数据(状态,整数,整数),但后来我会提供国家和只有这个国家的数据。数据不会改变。
我应该把所有东西都放到一个静态变量中,还是分成不同的变量?
怎么是这样的:
static class State {
String name;
int i1, i2;
State(String name, int i1, int i2) {
this.name = name;
this.i1 = i1;
this.i2 = i2;
}
}
final static Map<String, Map<String, State>> countryStateMap;
static {
countryStateMap = new HashMap<>();
Map<String, State> usa = new HashMap<>();
usa.put("NY", new State("NY", 100, 100));
usa.put("CO", new State("CO", 200, 200));
Map<String, State> ca = new HashMap<>();
ca.put("Quebec", new State("Quebec", 100, 100));
// and so on
countryStateMap.put("USA", usa);
countryStateMap.put("CA", ca);
}
这将使用最后的静态Map在静态块的初始化。初始化在类加载后立即完成。
然后你可以使用它像这样在你的代码
Map<String, State> usaStates = countryStateMap.get("USA");
State ny = usaStates.get("NY");
如Java是面向对象编程,我的建议是它的模型为对象
class State{
int code;
String Name;
int population;
//other info
}
class Country{
int code;
String name
List<State> state;
// Other details
}
现在,在一个类中创建国家
的List<Country> countries;
我明白了一个集合你的问题如下:
你想存储国家协会{sate,data1,data2}的集合,并稍后访问与特定国家/地区关联的集合。
在这种情况下,您可以使用提供这种关联的HashMap
。假设你有一个StateData
类捕获{状态,数据1,数据2}三重,你可以写:
HashMap<String, Collection<StateData>> countries;
填充与地图:
List<StateData> stateColl = new LinkedList<StateData>();
Map<String, List<StateData>> countries = new HashMap<String, List<StateData>>();
countries.put("USA", stateColl);
stateColl.add(stateData1);
stateColl.add(stateData2);
//...
其中stateData1
,...是类型StateData
。请注意,您可以使用任何符合您需要的集合而不是LinkedList
。如果您需要按照(按字母顺序)顺序存储国家,您也可以使用TreeMap
而不是HashMap
,但这会带来一些性能点击。
然后访问状态的集合为:
List<StateData> stateColl = countries.get("USA");
for (StateData stateData : stateColl)
{
// process the state info
}
谢谢@Attila你说类似于A4L,但我需要如何存储它,因为他写信息。 – Darka
我建议你有一个类来承载你需要保持(字符串,INT,INT)数据,像这样
class State{
private String name;
private int id,xyz;
//setter and getter methods
}
那么你可能需要两个列表/数组,一个用于美国,另一个用于CAN。
public class Foo{
private List<State> usGuys=new ArrayList<>();//you would use State[] instead
private List<State> canGuys=new ArrayList<>();
}
保持你要么让他们withing List
或arrays
的情况下,这是给你和要求。
而是关于您的问题,您将所有的数据保存到一个数组/列表,所以在这种情况下,你需要另一个属性添加到State
类来表示该国
private String country
但这可能复杂/ make-它很难在将来的过程中,因为例如如果你想获得美国的所有州,你需要一个for循环来检查哪些州属于美国,有多个列表可能会给你更好的管理
但是如果这些国家的规模是未知的!
很简单,像你这样的储存状态列表中,你将不得不保持国家的列表,像这样
class Country{
private List<State> states;
private String name;
}
class Foo{
private List<Countries> countries;
}
我希望我可以给一些手。
枚举将是理想的用于存储这些信息。自从Java5以来,它们是存储常量的首选方式。
它可以通过使用初始化块在一个操作中完成。一个最小的实施reprsent你的数据是:
您的实体创建类:
class Country {
String shortName;
List<State> states;
Country(String s, State... stateArray) {
shortName = s;
states = Arrays.asList(stateArray);
}
// getters omitted
}
class State {
String code;
int num1, num2:
State(String c, int n1, int n2) {
cude = c;
num1 = n1;
num2 = n2;
}
// getters omitted
}
然后创建变量:
List<Country> countries = new ArrayList<Country>() {{
add(new Country("USA",
new State("NU", 100, 100),
new State("CO", 200, 200)
);
add(new Country("CAN",
new State("Quebec", 100, 100)
);
}};
为什么不一个HashMap? –
你会如何“将所有东西放入一个静态变量”?你需要一些收集。 – Zong
为什么不用'String state''int'int int'whatever2'字段来设置'Country'类?如果有OOP的地方,它就在这里。如果你想这个数据不会改变,你可以让国家不可变(http://stackoverflow.com/questions/3162665/immutable-class) – Cruncher