繁体   English   中英

用一些静态数据创建变量的最佳方法

[英]Best way to create variable with some static data

我想知道,用Java创建变量的最佳方法是什么。

我有一个国家,一些int和另一个int:

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

有一些国家。 我知道我需要创建类,在其中放置此数据(状态,整数,整数),但是稍后我需要提供国家/地区并仅获取此国家/地区数据。 数据不会改变。

我应该将所有内容放入一个静态变量还是拆分为不同的变量?

由于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,数据2}的集合的关联,然后再访问与特定国家/地区关联的集合。

在这种情况下,您可以使用提供这种关联的HashMap 假设您有一个StateData类来捕获{state,data1,data2}三元组,则可以编写:

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
}

我建议您有一个类来托管需要保留的数据(字符串,整数,整数),类似这样

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<>();
}

对于保留实例,您可以将它们与Listarrays ,这取决于您和要求。

但是关于您的问题,您会将所有数据保存在一个数组/列表中,因此在这种情况下,您需要向State类添加另一个属性以指示国家/地区
private String country
但这可能会使以后的过程变得复杂/艰苦,因为例如,如果要获取美国的所有州,则需要一个for循环才能检查哪些州属于美国,拥有多个列表可能会给您一个更好的管理
但是,如果国家的大小未知,该怎么办!
很简单,就像您有用于存储状态的列表一样,您将有一个用于保存国家/地区的列表。

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

class Foo{
private List<Countries> countries;
}

我希望我能帮上忙。

枚举将是存储此信息的理想选择。 从Java5开始,它们是存储常量的首选方式。

可以使用初始化程序块在一个操作中完成。 表示您的数据的最小实现是:

为您的实体创建类:

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)
    );
 }};

这样的事情怎么样:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM