Java Arraylist排序问题

时间:2017-05-24 20:27:09

标签: java arrays sorting arraylist

我正在创建一个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:我可以应用一个小小的调整来使它工作,但我想知道;什么是实际问题。

5 个答案:

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