0

我有一个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但我想返回整个列表。

如何解决这个问题?

4

3 回答 3

4

Java不明白Json,基本上你正在做的是将一个字符串添加到一个数组中

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

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

问候

于 2013-03-27T15:16:06.500 回答
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我使用的将按键排序数据,您也可以使用 a按LinkedHashMap插入顺序存储数据。

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

于 2013-03-27T15:38:00.863 回答
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循环(我不确定您正在使用哪种对象)并简化您的 setter ( setLocationName) 以适应。

所以它会变成:

public void setLocationName(ArrayList<String> names)
    {
        this.array = names;
        System.out.println(array); //This return a long list
        System.out.println(array.size()); //But this only return the value 1
    }
于 2013-03-27T15:34:03.253 回答