【问题标题】:Why is the program not ordering the array?为什么程序不对数组排序?
【发布时间】:2021-08-15 14:46:50
【问题描述】:

我正在制作一个程序,通过将最大值移到末尾来排列数组,但由于某种原因,该程序没有按菜单排列值。 我该如何解决?

public static void main(String args[]) {
    ArrayList<Integer> list = new ArrayList<>(); 
    list.add(15); 
    list.add(78); 
    list.add(44); 
    list.add(99); 
    list.add(32);
    
    int num = 1;
    for(int i = 0; i<=list.size() -1;){
        if(list.get(i) > list.get(i+1)){
            list.add(list.get(i));
            list.remove(i);
            System.out.println(list);
        }
        else{
            i+=1;
            num+=1;
        }
    }
}

这是我得到的:

[15, 44, 99, 32, 78]
[15, 44, 32, 78, 99]

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 5 out of bounds for length 5
    at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
    at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
    at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248)
    at java.base/java.util.Objects.checkIndex(Objects.java:372)
    at java.base/java.util.ArrayList.get(ArrayList.java:458)
    at MyClass.main(MyClass.java:10)

【问题讨论】:

  • list.sort(); 怎么样?
  • 你得到什么输出?你期待什么输出?
  • 注意:i &lt;= list.size() -1 可以重写为i &lt; list.size()
  • 这就是我得到的:"""[15, 44, 99, 32, 78] [15, 44, 32, 78, 99] 线程“main”中的异常 java.lang.IndexOutOfBoundsException :在 java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64) 在 java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70) 的索引 5 超出了长度 5 ) 在 java.base/java.base/java.util 的 java.base/java.util.Objects.checkIndex(Objects.java:372) 的 java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248)。 ArrayList.get(ArrayList.java:458) 在 MyClass.main(MyClass.java:10)"""
  • 您的i 上升到列表的最后一个元素,此时list.get(i+1) 位于列表末尾之后,因此会引发异常。

标签: java arrays list integer


【解决方案1】:

这行得通:

public static void main(String args[]) {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(15); 
        list.add(78); 
        list.add(44); 
        list.add(99); 
        list.add(32);
    
        for(int i = 0; i < list.size() - 1; i++){
            for(int j = 0; j < list.size() - i - 1; j++){
                if(list.get(j) > list.get(j + 1)){
                    int temp = list.get(j);
                    list.set(j, list.get(j + 1));
                    list.set(j + 1, temp);
                }
            }
        }
        System.out.println(list);
    }

【讨论】:

    【解决方案2】:

    首先,在循环遍历列表时向列表添加和/或删除项目通常是个坏主意。你很幸运它在这里工作,因为你正在添加和删除相同数量的项目,但最好交换 i 和最后一个位置的项目:

    int last = list.get(list.size() - 1);
    list.set(list.size() - 1) = list.get(i);
    list.set(i) = last;
    

    但是对于您的问题:循环的索引 (i) 从 0 变为 4。在最后一个循环中,当您尝试 list.get(i+1) 时,您尝试获取索引 4+1 = 5,但列表只有大小为 5,因此没有索引 5

    在您的情况下,您只需要循环到倒数第二个索引,而不是最后一个:

    for(int i = 0; i<=list.size() - 2;){
    //       Change from 1 to 2 ----^
    

    【讨论】:

      【解决方案3】:

      下面的代码喜欢是IndexOutOfBoundsException 的原因。当i = 4i + 1 = 5 且 List 中没有索引匹配时。

          if(list.get(i) > list.get(i+1)){
      

      如果你想试试bubble sort,你可以试试下面

       for (int i = list.size() - 1; i >= 0; i--)
              for (int j = 0; j < i; j++) {
                  if (list.get(j) > list.get(j + 1)) {
                      int temp = list.get(j);
                      list.set(j, list.get(j + 1));
                      list.set(j + 1, temp);
                  }
              }
       System.out.println(list);
      

      如果您的意图是不使用自己的代码进行排序,则可以使用

          Collections.sort(list);
      

      【讨论】:

      • 但我希望它按菜单排序
      【解决方案4】:

      如果您想手动排序,则此代码有效:

      while  ( i < list.size()-1) {
              if(list.get(i) > list.get(i+1)){
                  list.add(list.get(i));
                  list.remove(i);
                  i--;
              } else {
                  i++;
              }
              
          }
      

      但为了提高效率,我建议您使用:

      Collections.sort(list);
      

      【讨论】:

        猜你喜欢
        • 2015-12-27
        • 1970-01-01
        • 1970-01-01
        • 2019-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-02
        • 1970-01-01
        相关资源
        最近更新 更多