如何将单个数组名称作为数组数组的字符串

时间:2015-01-15 13:57:00

标签: java arrays

// Facility table attributes to be read in json format
String facilityName[], recApp[], recFacility[], sendApp[], 
       sendFacility[], enable[], doneness[], retryLimit[], 
       watchDelay[], retryDelay[], ackTimeout[], 
       keepConOpen[], sendTimeout[], cleanupDelay[], 
       host[], port[];

String facilityTableAttrs[][] = new String[][] { 
       facilityName, recApp, recFacility, sendApp, 
       sendFacility, enable, doneness, retryLimit, 
       watchDelay, retryDelay, ackTimeout, keepConOpen, 
       sendTimeout, cleanupDelay, host, port};

我有一些名为facilityTableAttrs的数组,如上所述。

我有两个问题:

1)是否可以一步完成上述数组声明?

2)我希望使用以下内容获取这些1D数组的各个数组名称:

for(i = 0; i < facilityTableAttrs.length; i++) {
    System.out.println(facilityTableAttrs[i].toString());
}

但它失败了。如何将单个数组名称作为字符串?

3 个答案:

答案 0 :(得分:1)

您声明的第一个阵列列表似乎不会在任何地方初始化。

因此它们是null,并且在它们中的任何一个上调用toString将导致NullPointerException被抛出,因此&#34;它失败&#34;。

顺便说一句,在非null数组上调用toString实际上会打印类似于Object.toString表示的东西,这不是你想要的(Arrays.toString(myArray)是你的朋友)

您可以初始化每个单独的数组,并在将它们添加到主String[][]之前选择性地填充它们,但我建议您不要这样做。

相反,调查集合框架。

您可以使用的是Map<String, List<String>>

或者更好,甚至是具有List<String> facilityNameList<String> recApp等属性的自定义对象。

最后,请注意变量命名,根据code conventions camelBack

答案 1 :(得分:0)

这对阵列来说是不可能的。您需要使用地图,如下所示:

Map<String, List<String>> myMap = new HashMap<String, List<String>>();

您需要为您的问题选择正确的数据结构。

数组仅用于存储值,但它们对于它们的边界名称不感兴趣。 另一方面的地图很适合任何类型的值的边界名称(唯一的键)。

答案 2 :(得分:0)

我建议使用包装类:

public class Facility {
    private final String name;
    private final List<String> values;
    public Facility(String name) {
        this.name = name;
        this.values = new ArrayList<>(); 
    }
    public String getName() {
        return name;
    }
    public List<String> getValues() {
        return values;
    }
}

然后执行:

Facility[] facilities = new Facility[] {
    new Facility("facility 1"),
    new Facility("facility 2"),
    new Facility("facility 3"),
    new Facility("facility 4"),
};
for(Facility facility : facilities) {
    System.out.println(facility.getName());
}

要为您要执行的设施添加值:

Facility facility = facilities.get(0);
facility.getValues().add("bla");

如果您需要按名称查找设施,请使用地图而不是数组:

    ...
    // see createLookup method below
    Map<String, Facility> facilities = createLookup(
        new Facility("facility 1"),
        new Facility("facility 2"),
        new Facility("facility 3"),
        new Facility("facility 4"));

    // print names
    for(Facility facility : facilities.values()) {
        System.out.println(facility.getName());
    }

    // add a value
    Facility facility = facilities.get("facility 3");
    facility.getValues().add("bla");
}

private Map<String, Facility> createLookup(Facility.. facilities) {
    // use TreeMap to have sorted keys
    Map<String, Facility> lookup = new TreeMap<>();
    for(Facility facility : facilities) {
        lookup.put(facility.getName(), facility);
    }
    return lookup;
}