0
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

4 回答 4

4

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

  • 如果climbList最初为空,或者最初只包含一个元素,则测试i < climbList.size() - 1将失败,因此该函数将立即返回,什么也不做。
  • 如果climbList最初包含多个元素,则测试i < climbList.size() - 1将始终成功,因为每次通过循环都会添加一个元素climbList并将其递增i一。迭代前为真i < climbList.size() - 1,迭代后为真。所以你有一个无限循环。

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

于 2013-05-07T02:07:12.740 回答
0

你没有解释问题是什么。

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

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

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

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

我怀疑是尺寸检查。

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

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

  1. 如果你从一个空集合开始,那么爬升列表.size() = 0,这意味着爬升列表.size() - 1 = -1。0 不小于 -1,因此您的条件失败并且循环退出。
  2. 假设您从一个非空列表开始,那么您实际上将插入。但是,循环的每次迭代都会重新检查大小,但在循环中,您正在追加。本质上,您是在说“对于爬升列表中的每个元素,添加一个元素到爬升列表”。除非您从一个空列表开始,否则这将在某个时候耗尽内存。
于 2013-05-07T02:13:47.903 回答
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));

 } 
于 2013-05-07T02:11:29.897 回答
0

您不应该在迭代列表时修改它。

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

在此处此处阅读更多信息。

于 2013-05-07T02:23:54.590 回答