【问题标题】:java: Printing sorted arrayList is giving me IndexOutofBoundsExceptionjava:打印排序后的arrayList给了我IndexOutofBoundsException
【发布时间】:2016-12-03 21:59:59
【问题描述】:

这是对数组列表进行排序的调度程序类。我创建了一个自定义 compareTo 方法,它返回一个 int 值 1、-1 或 0。

private ArrayList<Event> events = new ArrayList<Event>();


public Scheduler(ArrayList<Event> events){


    for (int i=0; i<events.size(); i++)
    {
        this.events.add(events.get(i));

    }

} 

public ArrayList<Event> getSchedule(){
    int i;
    int j;
    int N = events.size();


        for (i = 0; i <=(N-1); i++)
    {
        for(j = 1; j <= N;j++)
        {

    if(events.get(i).getEndTime().compareTo(events.get(j).getEndTime()) > 0){
                Collections.swap(events, i, j);
            }
        }   
    }

    return events;
}

我稍后在我的 UI 类中调用它

Scheduler s = new Scheduler(events);

        System.out.println("Schedule:");

    for(int i = 0; i<s.getSchedule().size(); i++){
        System.out.println(s.getSchedule().get(i)); 
        }

它给了我一个 IndexOutofBoundError。为什么它给我这个错误,我该如何解决它

【问题讨论】:

标签: java arraylist indexoutofboundsexception


【解决方案1】:

在您的getSchedule() 方法中,您将i 迭代到N-1jN,其中N 是列表的大小。 n 对象的列表具有索引 0 to n-1,因此在访问索引 n 时,您会尝试访问列表最后一个元素之后的数据,这会为您提供 IndexOutOfBoundException

一个快速的解决方案可能是将N 设置为另一个值,应该是size - 1

int N = events.size() - 1;

更好:如果您实现了自定义的compareTo() 方法,那么您可以实现Comparable 接口,然后只需使用Collections.sort(events) 而不是自己对事件进行排序。

【讨论】:

  • 好的,更改 N 消除了 indexoutbounds 错误。但我意识到我的 compareTo 方法有问题。 public int compareTo(Time that){ if(this.getHour() &lt; that.getHour()) { return 1; } else if(this.getHour() &gt; that.getHour()) { return -1; } else{ if(this.getMinute() &lt; that.getMinute()) { return 1; } else if(this.getMinute() &gt; that.getMinute()) { return -1; } return 0; } 这阻止了我交换,因为无论如何它都会返回默认值。似乎很容易解决,但我无法得到它
  • 我尝试了一些类似的代码,它似乎工作。我在您的代码中看到的唯一内容是当this 小于thatcompareTo 应该返回一个负值(根据Java 8 Javadoc)。你有没有通过compareTo方法调试过?
猜你喜欢
  • 1970-01-01
  • 2014-05-15
  • 2013-06-22
  • 2016-03-22
  • 1970-01-01
  • 2018-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多