【问题标题】:How to iterate through two dimensional ArrayList using iterator?如何使用迭代器迭代二维 ArrayList?
【发布时间】:2014-03-26 03:35:47
【问题描述】:

我想使用迭代器遍历二维 ArrayList,其中包括 String 对象。我还想以一种让我选择是先水平(行)还是垂直(列)使用boolean 值进行迭代的方式进行迭代。如何在 java 中实现这个?

到目前为止我已经尝试过。

public class IterateThis implements Iterator<String>{
ArrayList<ArrayList<String>> array;

public IterateThis(){
    array = new ArrayList<ArrayList<String>>();
    array.add(new ArrayList<String>());
    array.add(new ArrayList<String>());
    array.add(new ArrayList<String>());
    array.get(0).add("1");
    array.get(0).add("2");
    array.get(0).add("2");
    array.get(1).add("4");
    array.get(1).add("5");
    array.get(1).add("6");
}

Iterator<String> it = array.iterator(); //This gives me an error...why?

我不知道如何实现boolean 值。

【问题讨论】:

  • 我没有看到你所尝试的布尔值......
  • 您在那里发现了什么类型的错误?请在此处提及错误。 “array”是 ArrayList 的列表。所以当你创建一个迭代器时。它应该是相同类型的列表。
  • “这给了我一个错误...为什么?”因为array.iterator()不是Iterator&lt;String&gt;而是Iterator&lt;List&lt;String&gt;&gt;
  • 既然你的类实现了Iterator,你就得实现IterateThis类的iterate方法,并将二维迭代的逻辑放在该方法中。

标签: java arrays arraylist iterator


【解决方案1】:

也许你需要实现两个版本,用boolean 来决定使用哪个循环:

public void iterate(boolean horizantalFirst){

    if(horizontalFirst){
        for(int i=0; i<array.size(); i++){              // first iterate through the "outer list"
            for(int j=0; j<array.get(i).size(); j++){   // then iterate through all the "inner lists"
                 array.get(i).get(j)="1";
            }
        }
    }else{ 
        int j=0;                            // index to iterate through the "inner lists"
        for(; j<array.get(j).size(); j++){   //dangerous, you need to be sure that there is a j-th element in array
            for(int i=0; i<array.size(); i++){  // iterate here through the outer list, by always working on the j-th element                
                array.get(i).get(j)="1";
            }
        }
    }
}

【讨论】:

  • 对不起,我才意识到我没有使用任何Iterator
  • 无论如何我更喜欢这种方式;-)
  • 我们在学校不得不使用迭代器来完成这项任务。所以for loop对我来说是没有选择的。
【解决方案2】:

为什么不试试这个:

import java.util.ArrayList;

public class Iteration
{
  private ArrayList<ArrayList<String>> array;

  public Iteration()
  {
    array = new ArrayList<>();

    array.add(new ArrayList<String>());
    array.get(0).add("000");
    array.get(0).add("001");
    array.get(0).add("010");

    array.add(new ArrayList<String>());
    array.get(1).add("100");
    array.get(1).add("101");
    array.get(1).add("110");
    array.get(1).add("111");

    iterateRowWise();
    System.out.println("\n\n");

    iterateColumnWise();
  }

  public void iterateRowWise()
  {
    // This uses iterator behind the scene.
    for (ArrayList<String> row : array)
    {
      for (String element : row)
      {
        System.out.print(element + " ");
      }
      System.out.println();
    }
  }

  public void iterateColumnWise()
  {
    int arraySize = array.size();
    int maxColumns = getMaximumListSize();
    for (int c = 0; c < maxColumns; c++)
    {
      for (int r = 0; r < arraySize; r++)
      {
        ArrayList<String> rowList = array.get(r);
        if (c < rowList.size())
        {
          System.out.print(rowList.get(c) + " ");
        }
      }
      System.out.println();
    }
  }

  private int getMaximumListSize()
  {
    int maxListSize = 0;
    for (ArrayList<String> rowList : array)
    {
      if (maxListSize < rowList.size())
        maxListSize = rowList.size();
    }

    return maxListSize;
  }

  public static void main(String[] args)
  {
    new Iteration();
  }
}

iterateRowWise() 方法使用迭代器进行迭代,但它是在幕后进行的。
iterateColumnWise() 方法不使用迭代器,但可以安全使用。

【讨论】:

  • rowwise简单,建议columnwise!!
  • 添加了 iterateColumnWise() 方法。 ;)
【解决方案3】:

按行迭代很简单,如@Awfully Awesome 答案所示。

尝试按列迭代,假设 List 将始终具有 m cross n 元素,其中 m=n

public static void IterateThis() {
    ArrayList<ArrayList<String>> array = new ArrayList<ArrayList<String>>();
    array.add(new ArrayList<String>());
    array.add(new ArrayList<String>());

    array.get(0).add("1");
    array.get(0).add("2");
    array.get(0).add("2");
    array.get(1).add("4");
    array.get(1).add("5");
    array.get(1).add("6");

    Iterator<ArrayList<String>> it = array.iterator();

    int topLevelIteratorResetCounter = 0;
    int noOfIteratorNextRequired = 1;

    int size = array.size();

    while (it.hasNext()) {

        ArrayList<String> strList = it.next();
        if (noOfIteratorNextRequired > strList.size())
            break;
        Iterator<String> itString = strList.iterator();
        int numtimes = 0;
        String str = null;
        while (numtimes != noOfIteratorNextRequired) {
            str = itString.next();
            numtimes++;
        }
        System.out.println(str);
        numtimes = 0;
        topLevelIteratorResetCounter++;
        if (topLevelIteratorResetCounter == size) { //as column count is equal to column size
            it = array.iterator();  //reset the iterator
            noOfIteratorNextRequired++;
            topLevelIteratorResetCounter = 0;
        }
    }
}

答案使用迭代器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-21
    • 2016-08-23
    • 2017-09-15
    • 2021-11-21
    • 2023-03-09
    • 2019-04-23
    • 2010-12-19
    • 1970-01-01
    相关资源
    最近更新 更多