2013-10-22 50 views
-1

我想知道,在Java中创建变量的最佳方法是什么。用一些静态数据创建变量的最佳方法

我有国家的状态,一些int和一些其他INT:

USA -> {{"NY", 100, 100},{"CO", 200, 200},...} 
CAN -> {{"Quebec", 100, 100} ...} 

有一些国家。我知道我需要创建类,在那里我会把这些数据(状态,整数,整数),但后来我会提供国家和只有这个国家的数据。数据不会改变。

我应该把所有东西都放到一个静态变量中,还是分成不同的变量?

+0

为什么不一个HashMap? –

+1

你会如何“将所有东西放入一个静态变量”?你需要一些收集。 – Zong

+0

为什么不用'String state''int'int int'whatever2'字段来设置'Country'类?如果有OOP的地方,它就在这里。如果你想这个数据不会改变,你可以让国家不可变(http://stackoverflow.com/questions/3162665/immutable-class) – Cruncher

回答

0

怎么是这样的:

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"); 
+0

谢谢@ A4L这几乎是我想要的。因此,为了提供建议,您建议将coutryStateMap静态放在某个类中,然后在不同的类中调用它,如someClass.coutryStateMap.get(“USA”);.将超过7个国家。 – Darka

+0

忘记我的问题。看到编辑。再次感谢。 – Darka

+0

@达尔卡不客气! – A4L

1

如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; 
1

我明白了一个集合你的问题如下:

你想存储国家协会{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 
} 
+0

谢谢@Attila你说类似于A4L,但我需要如何存储它,因为他写信息。 – Darka

1

我建议你有一个类来承载你需要保持(字符串,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 Listarrays的情况下,这是给你和要求。

而是关于您的问题,您将所有的数据保存到一个数组/列表,所以在这种情况下,你需要另一个属性添加到State类来表示该国
private String country
但这可能复杂/ make-它很难在将来的过程中,因为例如如果你想获得美国的所有州,你需要一个for循环来检查哪些州属于美国,有多个列表可能会给你更好的管理
但是如果这些国家的规模是未知的!
很简单,像你这样的储存状态列表中,你将不得不保持国家的列表,像这样

class Country{ 
private List<State> states; 
private String name; 
} 

class Foo{ 
private List<Countries> countries; 
} 

我希望我可以给一些手。

1

枚举将是理想的用于存储这些信息。自从Java5以来,它们是存储常量的首选方式。

1

它可以通过使用初始化块在一个操作中完成。一个最小的实施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) 
    ); 
}}; 
相关问题