我正在创建一个Android应用并使用Volley通过发帖请求来获取网页。并使用Jsoup解析HTML代码。我使用Jsoup选择器来过滤和提取所需的数据。然后我将数据拆分并存储在String数组中。最后,我循环字符串数组并将所有数据存储在Array列表中。
现在问题是,数据是标签和值的形式,我在数组列表中插入了数据(在第一个索引"标签"和第二个索引"值&# 34;)但是数组列表顺序不正确。它输出:
[Label 1, Label 2, Label 3, Label 4, Label 5, Value 5, Value 4, Value 3, Value 2, Value 1]
所以第一个标签是第一个索引,第一个值是最后一个索引。也许有些不对劲或缺失。
我在Java中创建了简单的示例场景,这里是示例代码:
public static void main(String[] args) {
ArrayList<String> arrayList = new ArrayList<>();
String labels = "Label 1: Label 2: Label 3: Label 4: Label 5";
String values = "Value 1\n Value 2\n Value 3\n Value 4\n Value 5\n";
String[] labelsArray = labels.split(":");
String[] valuesArray = values.split("\n");
for(int i = 0; i < labelsArray.length; i++){
arrayList.add(i, labelsArray[i]);
arrayList.add(i+1, valuesArray[i]);
}
System.out.println(arrayList.toString());
}
PS:我可以应用一个小小的调整来使它工作,但我想知道;什么是实际问题。
答案 0 :(得分:2)
查看您添加这些项目的位置。当i
为0时,您将标签添加为0,然后将value
添加为1.然后当i
为1时,您将标签添加为1(转移value
到2),然后另一个value
在2(在前一个值之前)。当i
为2时,您会在2处添加标签(在两个标签之后,在两个values
之前,将其向上推至3),然后在3之前添加value
上一个values
。
考虑使用add(x)
代替add(index, x)
答案 1 :(得分:2)
你正在改变价值观。从本质上讲,您尝试将一个变量用于两个不同的值。
在这个关键代码块中:
for(int i = 0; i < labelsArray.length; i++){
arrayList.add(i, labelsArray[i]);
arrayList.add(i+1, valuesArray[i]);
}
当i = 0
时,会在列表0和1中添加点。当i = 1
时,插入的点变为1和2.这有效地保持了“列表1中的元素的顺序” “,然后”列表2中的元素“。
\
要解决这个问题,最简单的方法是使用add()
;使用没有索引位置的add()
可以完全满足您的需求。
另一种方法是使用两个变量,而另一个变量需要前进多个位置。您可以在for
声明中声明更多内容。
for(int i = 0, arraySpot = 0; i < labelsArray.length; i++, arraySpot += 2){
arrayList.add(arraySpot, labelsArray[i]);
arrayList.add(arraySpot+1, valuesArray[i]);
}
答案 2 :(得分:0)
您在位置i处插入每个标签,其中i从0到4,而值在标签之后的位置i + 1中。这意味着在第一次迭代中,您将索引0处的Label 1和索引1处的值1插入。在下一次迭代中,i = 1,因此您将Index 2插入索引1,这会自动将Value 1推送到索引2.然后在索引2处插入值2,将值1进一步向下推到索引3.此时的列表为Label 1 Label 2 Value 2 Value 1
。对于所有其他标签/值对,这将继续。
答案 3 :(得分:0)
问题是您没有使用i
变量。这样:
for (int i = 0; i < labelsArray.length; i++){
arrayList.add(i, labelsArray[i]);
arrayList.add(i+1, valuesArray[i]);
}
应该是:
for (int i = 0; i < labelsArray.length; i++){
arrayList.add(i*2, labelsArray[i]);
arrayList.add(i*2 + 1, valuesArray[i]);
}
但是,尽管索引存在此错误,但在您的情况下,您实际上并不需要指定要添加每个字符串的位置。相反,只需使用List.add
版本将元素添加到列表末尾:
for (int i = 0; i < labelsArray.length; i++){
arrayList.add(labelsArray[i]);
arrayList.add(valuesArray[i]);
}
答案 4 :(得分:0)
要理解为什么会发生这种情况,你需要拆开for循环。
步骤0:i = 0
arrayList.add(i, "A"); // arrayList contains ["A"]
arrayList.add(i + 1, "B"); //arrayList contains ["A", "B"]
步骤1:i = 1
arrayList.add(i, "C"); // arrayList contains ["A", "C", "B"]
arrayList.add(i + 1, "D"); //arrayList contains ["A", "C", "D", "B"]
等等。
您实际上可以从添加中删除索引,如下所示:
arrayList.add("A");