Я получаю исключение во время выполнения, и я не знаю, что его вызывает - PullRequest
0 голосов
/ 22 апреля 2020

Я использую онлайн ide geeksforgeeks . Здесь я пытаюсь решить этот вопрос, используя TreeSet и передавая объект Comparator. Вопрос следующий:

Вам дан массив A размера N. Замените каждый элемент следующим самым большим элементом (самым большим элементом с правой стороны) в массиве. Кроме того, поскольку рядом с последним элементом нет элемента, замените его на -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)

Пожалуйста, исправьте код. Код

Ответы [ 3 ]

0 голосов
/ 22 апреля 2020

Невозможно воспроизвести NoSuchElementException, однако ваш код содержит бесконечные l oop, поскольку вы никогда не используете элементы в итераторе:

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]
0 голосов
/ 22 апреля 2020

Это потому, что вы для l oop в display() итерирует до n, что является значением элемента, а не количеством найденных элементов.

Таким образом, в вашем коде

int n=sc.nextInt();

'n' становится значением 887

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

Итерирует 84 раза (количество переданных элементов), затем выдает это исключение, потому что он не может go дальше (пытаясь добраться до 887). Следовательно

java.util.NoSuchElementException

Поскольку больше нет элементов, которые можно было бы использовать для использования nextInt()

0 голосов
/ 22 апреля 2020

java .util.NoSuchElementException возможно только тогда, когда консоль ввода исчерпана.

Кроме того, if(count==0) всегда будет истинным в приведенном выше коде, иначе блок будет никогда не будет казнен.

...