此方法不会将对象插入ArrayList。为什么?

时间:2013-05-07 02:00:47

标签: java

public void addClimb(String peakName, int climbTime){ 
  for(int i = 0; i < climbList.size()-1; i++){
    if(peakName.substring(0,1).compareTo(climbList.get(i).getName().substring(0,1)) <= 0){
             climbList.add(i, new ClimbInfo(peakName, climbTime));   
         } else {
             climbList.add(new ClimbInfo(peakName, climbTime));
         }
     }
 } 

目标是让它接受peakName和climbTime,让它循环遍历climbList中的climbTime对象,检查参数的第一个字母何时出现在循环中的climbTime的第一个字母之前,然后放置它一旦发生这种情况,但当我进入几个ClimbInfos并尝试打印它们时,我得到一个越界错误。此方法未正确将ClimbInfo正确插入到climbTime中。

有人可以解释我做错了吗?

4 个答案:

答案 0 :(得分:4)

根据初始条件,您的功能将执行以下两项操作之一:

  • 如果climbList最初为空,或者最初只包含一个元素,则测试i < climbList.size() - 1将失败,因此该函数将立即返回,不执行任何操作。
  • 如果climbList最初包含多个元素,那么测试i < climbList.size() - 1将始终成功,因为每次遍历循环都会向climbList添加一个元素并将增加{{1}一个人。所以i在迭代之前是真的,那么在迭代之后它将是真的。所以你有一个无限循环。

我认为这些都不是你想要的。

答案 1 :(得分:0)

基本上你循环遍历整个列表,每次循环都添加一条记录。 你可能想要这样的东西:

public void addClimb(String peakName, int climbTime){ 
  for(int i = 0; i < climbList.size(); i++){
    if(peakName.substring(0,1).compareTo(climbList.get(i).getName().substring(0,1)) >= 0){
       climbList.add(i, new ClimbInfo(peakName, climbTime));
       return;
    }
  }

  climbList.add(new ClimbInfo(peakName, climbTime));

 } 

答案 2 :(得分:0)

您未能解释问题所在。

  

此方法未正确将ClimbInfo正确插入到climbTime中。

不告诉我发生了什么。运行时异常?编译错误?或者你最后留下了一个空集合?

如果收到异常,请将其与堆栈跟踪一起包括在内。

如果我们假设你有一个空集合,那只能意味着一件事:永远不会达到for循环条件。我可以肯定地告诉它,因为if语句有一个插入的else。因此,保证循环的每次迭代都插入。因此,循环不能迭代。

我怀疑这是尺寸检查。

for(int i = 0; i < climbList.size()-1; i++){

由于两个原因,这种逻辑几乎肯定是错误的:

  1. 如果以空集合开头,则climbList.size()= 0,这意味着climbList.size() - 1 = -1。 0不小于-1,因此您的条件失败并且循环退出。
  2. 假设您从一个非空列表开始,那么您实际上将插入。但是,循环的每次迭代都会重新检查大小,但在循环中,您要追加。从本质上讲,你说的是“对于爬升列表中的每个元素,添加一个元素到爬升列表”。除非你从空列表开始,否则在某些时候会耗尽内存。

答案 3 :(得分:0)

在迭代时不应修改列表。

我认为你在这里想要实现的是自定义排序。为此,您必须在ClimbInfo中实现Comparable接口并使用Collections.sort(climbList)

了解更多herehere