为什么我的array.size()给出错误的值?

时间:2013-03-27 15:10:58

标签: java arraylist

我有ArrayList名为array的实例。 当我解析一些JSON数据时,它会将它全部存储在array中。 当我执行System.out.println(array);时,它会列出一长串项目,大约30个,但是当我写System.out.println(array.size);时,它会给出一个值。

为什么当列表包含至少30个值时,它只给出值1?

我的代码:

public void setLocationName (String name) {
    array = new ArrayList<String>();
    array.add(name);
    System.out.println(array); //This return a long list
    System.out.println(array.size()); //But this only return the value 1
}

public String[] getLocationName() {
    String tArray[] = null;
    for (int i = 0; i < array.size(); i++){
      System.out.println(i);
      tArray = array.toArray(new String[i]);    
    }       
    return tArray;
}

}

长名单:

[Brunnsparken, Göteborg]
[Brunnsgatan, Göteborg]
[Brunnslyckan, Lerum]
[Brunnsbotorget, Göteborg]
[Brunnsnäs, Ulricehamn]
[Brunnshult, Mellerud]
[Brunnsdal, Skövde]
[Brunns skola, Ulricehamn]
[Brunnsgården, Kungälv]
[Brunns kyrka, Ulricehamn]
[Boråsparken, Borås]
[Stadsparken, Ulricehamn]
[Lysekilsparken, Lysekil]
[Mössebergsparken, Falköping]
[Dalaborgsparken, Vänersborg]
[Rösparken, Åmål]
[Lillhagsparken Norra, Göteborg]
[Lillhagsparken Södra, Göteborg]
[Sylte Ryrbäcksparken, Trollhättan]
[Skogstomtsparken, Borås]
[Svinesundsparken, Norge]
[Håjumsparken, Trollhättan]
[Eriksdalsparken, Bollebygd]
[Fridhemsparken, Lidköping]

我的结果是tArray中只返回列表中的一个项目,但我想返回整个列表。

如何解决这个问题?

3 个答案:

答案 0 :(得分:4)

Java不理解Json,基本上你正在做的是在数组中添加一个字符串

this.array.add(name); ---&gt;向数组添加一个值,因此大小只有一个

您可能需要使用特定的Json库将数据解析为java arraylist。

问候

答案 1 :(得分:0)

public void setLocationName (String name) {
    array = new ArrayList<String>();
    array.add(name);
    System.out.println(array); //This return a long list
    System.out.println(array.size()); //But this only return the value 1
}

每次调用此方法时,您都在创建新的ArrayList

array = new ArrayList<String>();

您可以删除上面的行,但是我建议您重命名该方法,因为它不再是一个setter,而且实际上每次调用此方法时都会添加到现有列表中。

我建议你要做的是在解析为setter之前构建你的List,也许使用foreach loop(我不确定你正在使用什么类型的对象)并简化你的setter({{ 1}})以适应。

所以它会变成:

setLocationName

答案 2 :(得分:0)

看起来你需要将String解析成对。

在我看来,Map可能是最适合存储数据的结构 - 我认为该值的第一部分是唯一的。

正则表达式可能是解析数据的最佳方法:

public static void main(String[] args) {

    final String data = "[Brunnsparken, Göteborg]\n"
            + "[Brunnsgatan, Göteborg]\n"
            + "[Brunnslyckan, Lerum]\n"
            + "[Brunnsbotorget, Göteborg]\n"
            + "[Brunnsnäs, Ulricehamn]\n"
            + "[Brunnshult, Mellerud]\n"
            + "[Brunnsdal, Skövde]\n"
            + "[Brunns skola, Ulricehamn]\n"
            + "[Brunnsgården, Kungälv]\n"
            + "[Brunns kyrka, Ulricehamn]\n"
            + "[Boråsparken, Borås]\n"
            + "[Stadsparken, Ulricehamn]\n"
            + "[Lysekilsparken, Lysekil]\n"
            + "[Mössebergsparken, Falköping]\n"
            + "[Dalaborgsparken, Vänersborg]\n"
            + "[Rösparken, Åmål]\n"
            + "[Lillhagsparken Norra, Göteborg]\n"
            + "[Lillhagsparken Södra, Göteborg]\n"
            + "[Sylte Ryrbäcksparken, Trollhättan]\n"
            + "[Skogstomtsparken, Borås]\n"
            + "[Svinesundsparken, Norge]\n"
            + "[Håjumsparken, Trollhättan]\n"
            + "[Eriksdalsparken, Bollebygd]\n"
            + "[Fridhemsparken, Lidköping]";
    final Pattern pattern = Pattern.compile("\\[([^,]++),\\s++([^\\]]++)\\]");
    final Matcher matcher = pattern.matcher(data);
    final Map<String, String> items = new TreeMap<>();
    while (matcher.find()) {
        items.put(matcher.group(1), matcher.group(2));
    }
    for (final Entry<String, String> entry : items.entrySet()) {
        System.out.println(entry);
    }
}

此输出:

Boråsparken=Borås
Brunns kyrka=Ulricehamn
Brunns skola=Ulricehamn
Brunnsbotorget=Göteborg
Brunnsdal=Skövde
Brunnsgatan=Göteborg
Brunnsgården=Kungälv
Brunnshult=Mellerud
Brunnslyckan=Lerum
Brunnsnäs=Ulricehamn
Brunnsparken=Göteborg
Dalaborgsparken=Vänersborg
Eriksdalsparken=Bollebygd
Fridhemsparken=Lidköping
Håjumsparken=Trollhättan
Lillhagsparken Norra=Göteborg
Lillhagsparken Södra=Göteborg
Lysekilsparken=Lysekil
Mössebergsparken=Falköping
Rösparken=Åmål
Skogstomtsparken=Borås
Stadsparken=Ulricehamn
Svinesundsparken=Norge
Sylte Ryrbäcksparken=Trollhättan

您可以通过循环(如上所述)或通过按键从Map获取值来访问项目。我使用的TreeMap会按键对数据进行排序,您也可以使用LinkedHashMap按插入顺序存储数据。

您还可以将项目存储在类似结构的List中。