【问题标题】:Collections.max not working in a loop: "java.util.NoSuchElementException"Collections.max 不在循环中工作:“java.util.NoSuchElementException”
【发布时间】:2016-10-31 17:52:27
【问题描述】:
public static void main(String args[])
{
    ArrayList <Integer> seq = new ArrayList<Integer>();
    Scanner kbReader = new Scanner(System.in);
    int iterations = 0;
    System.out.println("Enter a number sequence(no spaces, only commas)");
    String j = kbReader.nextLine();
    kbReader = new Scanner(j);
    kbReader.useDelimiter("\\D");

    //adds input to array list
    while(kbReader.hasNextInt())
    {
        int i = kbReader.nextInt();
        seq.add(i);
    }

    while(seq.size() > 0)
    {
        //removes zeros and numbers behind
        if(seq.contains(0)) 
        {   
            int zeroSearch = seq.lastIndexOf(0);
            for(int c = zeroSearch; c >= 0; c--)
            {
                seq.remove(c);
            }
            iterations++;

        }   


        //number operations
        int largest = Collections.max(seq);
        int largeLoc = seq.lastIndexOf(largest);

        if(largest % 2 == 0)
        {
            largest = largest -2;
            iterations++;
        }
        else
        {
            largest--;
            iterations++;
        }
        seq.set(largeLoc, largest);
    }

    System.out.println(iterations + "moves" required);
}

由于某种原因,max 方法在此循环中不起作用并返回错误“java.util.NoSuchElementException”。方向读取“给定一个数列,删除所有的零,如果有的话,以及它们左边的所有数字。然后找到最大的剩余数字,如果是偶数则减去 2,或者如果是奇数则减去 1从它。如果两个或多个数字成为并列最大数字,则使用最右边的数字作为最大数字。重复将规则应用于序列。删除序列需要多少步?"

【问题讨论】:

标签: java loops arraylist collections


【解决方案1】:

在这种情况下,您可以阅读 java.util.Collections#max 的 javadoc 以了解它为什么会抛出该错误:

投掷

NoSuchElementException - 如果集合为空。

Collections Javadoc

很明显seq 是空的(意味着kbReader 可能没有什么可读的)。为您的代码添加调试以更清楚地看到这一点(例如输入/输出)。

【讨论】:

  • kbReader 仅在开头读取,而不是在实际更改数组列表的 while 循环中读取。 kbReader 只是将输入添加到数组列表中,因此“将输入添加到数组列表”注释。
  • 是的,如果它什么也没读,它不会在列表中添加任何内容。然后这个异常就会发生,因为你的列表是空的。
  • 错了。仅当用户不输入任何内容时才会发生该错误,而输入时发生错误。我已经通过打印出用户输入的 ArrayList 测试了 Scanner,它工作正常。问题在于,在大型 while 循环中,在多次迭代删除零之后,一旦大小为零,就没有 break 语句退出循环,从而导致该错误。无论如何感谢您的帮助。
  • 不错的发现。再一次,读者是空的只是一个合理的原因,真正的原因(如前所述)是你传递了一个空列表。 Debug 一直是发现这些问题的好朋友。
  • 是的,你是对的。但是,我仍然对调试有点不放心。
猜你喜欢
  • 2023-03-02
  • 2018-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多