【问题标题】:How to get 5 record from arraylist using java如何使用java从arraylist中获取5条记录
【发布时间】:2012-10-04 11:30:14
【问题描述】:

谁能帮我完成这项工作。

我有 3 个数组列表

ArrayList alDeposits = new ArrayList(); 
ArrayList alWithDrawals = new ArrayList(); 
ArrayList alChecks = new ArrayList();

假设所有这三个数组列表的长度为 n。现在我的问题是如何使用 for Loop 从这三个 arrayList 中读取 5 条记录,直到最后一个索引。
例如

alDeposits.length = 8; 
alWithDrawals.length = 7; 
alChecks = 13; 

对于第一次 for 循环运行,我将从 alDeposits 获得 5 条记录,与 alWithDrawals、alChecks 相同

我将第二次从 alDeposits 获得 3 条记录,从 alWithDrawals 获得 2 条记录,从 alChecks 获得 5 条记录

对于第三次循环运行,我将从 alDeposits、alWithDrawals 获得 0 条记录,从 alChecks 获得剩余 3 条记录

我不确定我的解释是否清楚。

【问题讨论】:

  • 您尝试编写的哪些代码不起作用?我建议您阅读介绍性编程书籍或参加课程,因为这将帮助您了解解决此类问题所需的知识。

标签: java for-loop arraylist


【解决方案1】:

在某种程度上你已经回答了你自己的问题,这正是你得到它的方式!!!

首先,您应该使用堆栈或队列,而不是可以使用 pop() 和 push() 的数组列表。

然后只需检查堆栈/队列的大小,如果大于 = 到 5 pop() 5 次,否则 pop() 0 - stack.size() 次。

如果 stack.size() 已经为零,则移动到下一个堆栈。

【讨论】:

  • 想想你真正需要哪种数据结构总是好的,但在这种情况下,如果他想在以后保留数据,那么某种list 工作得很好。使用stack/queue 他会丢失数据,除非他有另一组stack/queues/lists 将其全部推回。
【解决方案2】:

只需维护 3 个计数器即可查看您的列表

    int i1 = 0;
    int i2 = 0;
    int i3 = 0;
    ArrayList alDeposits = new ArrayList();
    ArrayList alWithDrawals = new ArrayList();
    ArrayList alChecks = new ArrayList();

    do {
        ArrayList<Object> result = new ArrayList<Object>();
        for (int i = 0; i1 < alDeposits.size() && i < 5; i1++) {
            result.add(alDeposits.get(i1));
            i++;
        }
        for (int i = 0; i2 < alWithDrawals.size() && i < 5; i2++) {
            result.add(alWithDrawals.get(i2));
            i++;
        }
        for (int i = 0; i3 < alChecks.size() && i < 5; i3++) {
            result.add(alChecks.get(i3));
            i++;
        }
        //now do something with result
    } while (i1 != alDeposits.size() || i2 != alWithDrawals.size() || i3 != alChecks.size());

关键观察是不要在连续读取之间重置您的计数器(i1i2i3)。

【讨论】:

  • 您好 Origin,感谢您的回复,但此解决方案不适用于我。
  • @sanjuchoudhari 我更新了代码,每组提供 5 个元素
【解决方案3】:
//You will need to create a 'max(a, b, c)' method, this is pseudo-code
maxSize = max(alDeposits.size(),alWithDrawals.size(),alChecks.size());

//increment index with step=5
for(int index = 0;index < maxSize;index += 5){

    //get 5 records or less
    for(int i=index; i<(index+5) && i<alDeposits.size(); i++)
        alDeposits.get(i);
    for(int j=index; j<(index+5) && j<alWithDrawals.size(); j++)
        alWithDrawals.get(j);
    for(int k=index; k<(index+5) && k<alChecks.size(); k++)
        alChecks.get(k);

}

【讨论】:

  • 1.你的max() 方法是什么?有Math.max(),但只需要两个参数。如果是,则应将其标记为伪代码。 2.您有一些复制粘贴错误。所有三个循环都使用alDeposits
  • max()的方法是从三个常量中取最大值。你可以自己实现;感谢您的提醒,我刚刚编辑了它。
  • 没问题。不过还有一些复制粘贴的东西,所以我继续为您编辑它们。
【解决方案4】:

如果我能很好地理解您的问题,那么对您的问题的一种回答是:

      ArrayList alDeposits = new ArrayList(); 
      ArrayList alWithDrawals = new ArrayList(); 
      ArrayList alChecks = new ArrayList();  
      while (!alDeposits.isEmpty() || !alWithDrawals.isEmpty() || !alChecks.isEmpty()) {
      //get record 5 times until list is empty
        for (int i=0 ; i<5; i++) {
          if (!alDeposits.isEmpty()) {
            alDeposits.remove(0);//get record
          }
          if (!alWithDrawals.isEmpty()) {
            alWithDrawals.remove(0);//get record
          }
          if (!alChecks.isEmpty()) {
            alChecks.remove(0);//get record
          }
        }
      }

【讨论】:

  • 我接受了你的想法并正在努力。非常感谢您的及时回复。
  • if 语句中的所有 get 语句都引用相同的 alDeposits-ArrayList。我认为应该将它们替换为相关的 ArrayList。我还怀疑必须删除与 get 语句一起使用的每个元素。显示的代码将无限循环,因为集合永远不会为空。
  • Origin 评论是正确的,但正如我在帖子中所说,这是一个快速回答,作为解决问题的提示。我相应地更正了代码。
  • @resus 你能把你的代码提供给我吗?感谢您的回复。
  • 感谢大家的帮助...:)
猜你喜欢
  • 2015-12-26
  • 2022-10-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-08
  • 1970-01-01
  • 2022-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多