我得到一个运行时异常,我不知道是什么原因造成的。

问题描述 投票:0回答:1

我正在使用一个在线思想 geeksforgeeks. 在这里,我试图使用TreeSet和传递一个比较器对象来解决这个问题。问题如下。

给你一个大小为N的数组A. 用数组中下一个最大的元素(右边最大的元素)替换每个元素. 另外,由于最后一个元素旁边没有元素,所以用-1代替。

对t个测试用例这样做:这是我写的代码。

import java.util.*;
import java.lang.*;
import java.io.*;

class GFG {
    static Scanner sc=new Scanner(System.in);
    public static void main (String[] args) {
        //code
        int t=sc.nextInt();
            for(int i=0;i<t;i++)
                display();
    }
    static void display(){
        int n=sc.nextInt();
        Set<Integer> ts=new TreeSet<Integer>(new myComparator());
        int a;
        for(int i=0;i<n;i++){
            a=sc.nextInt();
            ts.add(a);
        }
        Iterator itr=ts.iterator();
        int count=0;
        while(itr.hasNext()){
            if(count==0)
                continue;
            else{
                System.out.print(itr.next()+" ");
            }
        }
        System.out.print(-1);
        System.out.println();
    }
}
class myComparator implements Comparator<Integer>{
    public int compare(Integer obj1,Integer obj2){
        if(obj2>obj1)
            return 1;
        else if(obj2<obj1)
            return -1;
        else 
            return 0;
    }
}

我的代码出现的错误:

Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Scanner.java:862)
    at java.util.Scanner.next(Scanner.java:1485)
    at java.util.Scanner.nextInt(Scanner.java:2117)
    at java.util.Scanner.nextInt(Scanner.java:2076)
    at GFG.display(File.java:20)
    at GFG.main(File.java:13)

请修改代码程式碼

java runtime-error comparator treeset nosuchelementexception
1个回答
0
投票

这是因为你的for循环在 display() 迭代到 n 是元素的值,而不是找到的元素数量。

所以在你的代码中

int n=sc.nextInt();

'n'成为值887

for(int i=0;i<n;i++){

迭代84次(传递进来的元素数量),然后抛出这个异常,因为它不能再继续下去了(试图到达887)。因此

java.util.NoSuchElementException

因为没有更多的元素了,可以使用 nextInt()


0
投票

java.util.NoSuchElementException(异常) 只有在输入控制端用尽时才有可能。

除此以外 if(count==0) 在上述代码中,将始终为真,否则块将永远不会被执行。


0
投票

无法重现 NoSuchElementException然而,你的代码包含了无尽的循环,因为你从未在迭代器中消耗元素。

while(itr.hasNext()){
    if(count==0)
        continue;
    else {
       System.out.print(itr.next()+" ");
    }
}

假设这个问题已经解决了,代码也能运行,还有其他的问题。

  • 使用Set会导致输入数据的丢失
  • 使用反向比较器改变输出顺序
  • 你的代码似乎没有产生包含-1的输出数组。

在应用这些修复和测试后

Iterator itr=ts.iterator();
int count=0;
while(itr.hasNext()){
    if (count == 0) {
        itr.next();
        count++;
    } else {
        System.out.print(itr.next() + " ");
    }
}
System.out.print(-1);
System.out.println("\nEND" + ts);

检索到以下结果。

input n:

5

20 20 30 40 40

30 20 -1
END[40, 30, 20]
© www.soinside.com 2019 - 2024. All rights reserved.