0
votes

Je reçois une exception d'exécution et je ne sais pas ce qui la cause

J'utilise une idée en ligne geeksforgeeks . Ici, j'essaie de résoudre cette question en utilisant TreeSet et en passant un objet Comparator. La requête est la suivante:

On vous donne un tableau A de taille N. Remplacez chaque élément par le plus grand élément suivant (le plus grand élément sur son côté droit) dans le tableau. De plus, comme il n'y a pas d'élément à côté du dernier élément, remplacez-le par -1.

Faites ceci pour t cas de test: Voici le code que j'ai écrit:

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)

L'erreur que mon code génère:

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;
    }
}

Veuillez rectifier le code. Code


2 commentaires

Que dit le javadoc pour NoSuchElementException?


Est-ce que cela répond à votre question? Le scanner ignore nextLine () après avoir utilisé next () ou nextFoo ( )?


3 Réponses :


0
votes

java.util.NoSuchElementException n'est possible que lorsque la console d'entrée est épuisée.

En dehors de cela, if (count == 0) sera toujours vrai dans le code ci-dessus et le bloc else ne sera jamais exécuté.


0 commentaires

0
votes

Impossible de reproduire NoSuchElementException , cependant, votre code contient une boucle sans fin car vous ne consommez jamais d'éléments dans l'itérateur:

30 20 -1
END[40, 30, 20]

En supposant que ce problème est résolu, et le code s'exécute, il y a d'autres problèmes:

  • l'utilisation de Set entraîne la perte des données d'entrée
  • l'utilisation du comparateur inversé modifie l'ordre de sortie
  • votre code ne semble pas produire de tableau de sortie contenant -1

Lors de l'application de ces correctifs et des tests

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);

les résultats suivants ont été récupérés:

input n: code>

5

20 20 30 40 40

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

p>


0 commentaires

0
votes

C'est parce que votre boucle for dans display () itère vers n qui est la valeur de l'élément, pas le nombre d'éléments trouvés.

Donc dans votre code

java.util.NoSuchElementException

'n' devient la valeur 887

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

Itère 84 fois (le nombre des éléments passés), puis lève cette exception car elle ne peut pas aller plus loin (en essayant d'atteindre 887). D'où

int n=sc.nextInt();

Parce qu'il ne reste plus d'éléments à utiliser avec nextInt()


0 commentaires