【问题标题】:Java Arraylist Sorting IssueJava Arraylist 排序问题
【发布时间】:2017-05-24 20:27:09
【问题描述】:

我正在创建一个 Android 应用程序并使用 Volley 通过发出发布请求来获取网页。并使用 Jsoup 来解析 HTML 代码。我使用 Jsoup 选择器来过滤和提取所需的数据。然后我拆分数据并存储在一个字符串数组中。最后,我循环字符串数组并将所有数据存储在数组列表中。

现在的问题是,数据是标签和值的形式,我已经在数组列表中插入了数据,例如(第一个索引“标签”和第二个索引“值”)但是数组列表顺序不正确。它输出:

[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:我可以稍微调整一下,但我想知道;真正的问题是什么。

【问题讨论】:

  • 我很惊讶你看到价值观,除了你的最后一个。每次您迭代时,您都在添加 over 您的价值。 add(0, Label); add(1, Value) 然后你做 add(1, Label); add(2, Value); 然后 add(2, Label); add(3, Value); 等等。

标签: java arrays sorting arraylist


【解决方案1】:

看看你在哪里添加这些项目。当i 为0 时,在0 处添加标签,然后在1 处添加value。然后当i 为1 时,在1 处添加标签(将value 移动到2),然后再添加一个@ 987654325@ 位于 2(前一个值之前)。当 i 为 2 时,您在 2 处添加一个标签(在您的两个标签之后和您的两个 values 之前,它们被推到 3),然后在 3 处添加一个 value,在所有之前的 values 之前。

考虑使用add(x) 而不是add(index, x)

【讨论】:

  • 谢谢,我宁愿不指定索引就用它!
【解决方案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 中的元素”的顺序,then“列表 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]);
}

【讨论】:

    【解决方案3】:

    您在标签之后的位置 i 插入每个标签,其中 i 从 0 到 4 和位置 i+1 中的值。这意味着在第一次迭代中,您在索引 0 处插入标签 1,在索引 1 处插入值 1。在下一次迭代中,i = 1,因此您在索引 1 处插入标签 2,这会自动将值 1 推送到索引2. 然后在索引 2 处插入值 2,将值 1 进一步向下推到索引 3。此时的列表是 Label 1 Label 2 Value 2 Value 1。对于所有其他标签/值对,这将继续。

    【讨论】:

      【解决方案4】:

      问题是您没有按照应有的方式使用 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]);
      }
      

      【讨论】:

      • 是的 Federico,这就是问题所在。我花了一整天的时间来解析 html 并从一个非常长的 html 中选择数据。所以,我有点困惑,没有注意到这个问题。感谢您的澄清!
      • @Atlas_Gondal 很高兴我能帮上忙。
      【解决方案5】:

      要了解为什么会发生这种情况,您需要拆开那个 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");
      

      【讨论】:

        猜你喜欢
        • 2016-04-30
        • 1970-01-01
        • 2013-05-09
        • 1970-01-01
        • 2014-08-09
        • 2014-06-25
        • 2014-10-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多