2016-09-30 3 views
-4

Je cours un code qui prend une liste d'ints, et une liste de chaînes, et augmente séparément la taille du tableau à la bonne taille, puis trie le tableau dans une méthode différente tout en trouvant ensuite une instance d'un doublon. Le code est bon jusqu'au point où j'exécute les méthodes où il trie mon tableau et recherche les doublons. Je sais quel devrait être le bon résultat, et il ne devrait pas y avoir de doublon dans intList et un double trouvé dans wordList à l'index 45788. J'ai demandé de l'aide à d'autres personnes pour faire la même tâche et avoir le même code. Je dois être quelque part mais je ne peux pas trouver où. J'ai joint une photo des deux méthodes à côté de la sortie dans l'invite de commande. Merci pour toute aideJava Run Erreur sur le code qui fonctionne

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

public class Lab4 
{ 
    static final int INITIAL_CAPACITY = 10; 
    static final int NOT_FOUND = -1; // indexOfFirstDupe returns this value if no dupes found 

    public static void main (String[] args) throws Exception 
    { 
     // ALWAYS TEST FIRST TO VERIFY USER PUT REQUIRED INPUT FILE NAME ON THE COMMAND LINE 
     if (args.length < 1) 
     { 
      System.out.println("\nusage: C:\\> java Lab4 <numbers file> <words filename>\n\n"); // i.e. C:\> java Lab4 10000ints.txt 172822words.txt 
      System.exit(0); 
     } 

     String[] wordList = new String[INITIAL_CAPACITY]; 
     int[] intList = new int[INITIAL_CAPACITY]; 
     int wordCount = 0, intCount=0; 
     Scanner intFile = new Scanner(new File(args[0])); 
     BufferedReader wordFile = new BufferedReader(new FileReader(args[1])); 

     // P R O C E S S I N T F I L E 
     while (intFile.hasNextInt()) // i.e. while there are more ints in the file 
     { 
      if (intCount == intList.length) 
       intList = upSizeArr(intList); 
      intList[intCount++] = intFile.nextInt(); 

     } //END WHILE intFile 

     //close intfile 
     intFile.close(); 

     //output text with variables 
     System.out.format("%s loaded into intList array. size=%d, count=%d\n",args[0],intList.length,intCount); 

     int dupeIndex = indexOfFirstDupe(intList, intCount); 

     if (dupeIndex == NOT_FOUND) 
     { 
      System.out.format("No duplicate values found in intList\n"); 
     } 
     else 
     { 
      System.out.format("First duplicate value in intList found at index %d\n",dupeIndex); 
     } 

     // P R O C E S S S T R I N G F I L E 
     while (wordFile.ready()) // i.e. while there is another line (word) in the file 
     { 
      if (wordCount == wordList.length) 
       wordList = upSizeArr(wordList); 
      wordList[wordCount++] = wordFile.readLine(); 
     } //END WHILE wordFile 

     //closing wordfile 
     wordFile.close(); 

     //output text again with variables 
     System.out.format("%s loaded into word array. size=%d, count=%d\n",args[1],wordList.length,wordCount); 

     dupeIndex = indexOfFirstDupe(wordList, wordCount); 

     if (dupeIndex == NOT_FOUND) 
     { 
      System.out.format("No duplicate values found in wordList\n"); 
     } 
     else 
     { 
      System.out.format("First duplicate value in wordList found at index %d\n",dupeIndex); 

     } 
    } 

    // -------------------------------------------------------------------------------------------------------------------------------- 

    // method to double size of string array 

    static String[] upSizeArr(String[] fullArr) 
    { 
     int length = fullArr.length; 

     //creating a new array of double size 
     String[] upsizearr = new String[length*2]; 

      //this for loop assigns each old variable in fullArr 
      //and assigns it to the new larger array, upsizearr 
      for(int i = 0; i<length-1; i++) 
      { 
       upsizearr[i] = fullArr[i]; 
      } 

     return upsizearr; 
    } 


    // method to double size of int array 

    static int[] upSizeArr(int[] fullArr) 
    { 
     int length = fullArr.length; 

     //creating new array of double size 
     int[] upsizearr = new int[length*2]; 

      //this loop does the same as in upSizeArr method, 
      //assigning all values to new bigger array 
      for(int i = 0; i<length-1; i++) 
      { 
       upsizearr[i] = fullArr[i]; 
      } 

     return upsizearr; 
    } 


    // use Arrays.sort() before scanning for dupe 
    static int indexOfFirstDupe(int[] arr, int count) 
    {  
     Arrays.sort(arr); 
     int value = NOT_FOUND; 

     for(int i = (arr.length - count); i < count; i++) 
     { 
      if(arr[i] == arr[i-1]) 
      { 
       value = i; 
       break; 
      } 
     } 

     return value; 
    } 


    // use Array.sort() before scanning for dupe 
    static int indexOfFirstDupe(String[] arr, int count) 
    {  

     Arrays.sort(arr); 
     int value = NOT_FOUND; 

     for(int i = (arr.length - count); i < count; i++) 
     { 
      if(arr[i] == arr[i-1]) 
      { 
       value = i; 
       break; 
      } 
     } 

     return value; 
    } 

} // END CLASS 

[cmd and sorting/finding dupe arrays] [code where errors occur] 2

+0

Si elle le « code qui fonctionne » « erreur d'exécution » qu'il ne peut pas être et vice versa – Antoniossss

+0

Ajoutez votre code à la question à la place des images. – TimeToCode

+2

Vous avez montré l'exception (dans une image au lieu de copier et coller), puis n'affichez même pas la ligne à laquelle il fait référence (ligne 144, dans indexOfFirstDupe) ... – jonhopkins

Répondre

1

Réponse révisée:

Après avoir examiné cette question de plus près. Il semble que Arrays.sort() soit à blâmer. Une possibilité est la façon dont les tailles de tableau sont augmentées par "upSizeArr". Ou wordFile.readLine() renvoie une valeur nulle lors de l'ajout de mots au tableau wordList. Quelle que soit la raison, l'erreur "countRunAndMakeAscending" est principalement due à des valeurs nulles dans le tableau à trier.

D'autres ont couru sur cette question ainsi:

Sorting an array of strings in Java

La suggestion est d'utiliser un ArrayList. Alternativement, en bouclant à travers les tableaux et en définissant n'importe quelles valeurs nulles à une valeur non nulle avant le tri pourrait résoudre ceci. Cependant, vous devrez déterminer un bon candidat de valeur non nulle qui ne corromprait pas l'ensemble de données lors de la recherche de dupes dans la méthode "indexOfFirstDupe". Par conséquent, apprendre à utiliser ArrayList est peut-être le chemin le plus facile.

En laissant l'ancienne solution publiée car elle résout un problème distinct dans votre code.

ancienne réponse:

Il semble que votre code est une valeur nulle rencontre des boucles sur le tableau de liste de mots. Lorsque vous parcourez votre code, il apparaît que le problème peut également exister dans la liste int. Donc ... un couple de choses à corriger. Modifiez la façon dont vous définissez des mots et des mots dans les tableaux en incrémentant les variables intCount et wordCount en dernier dans les boucles while.

Lors du chargement ints dans le intList ...

// P R O C E S S I N T F I L E 
    while (intFile.hasNextInt()) // i.e. while there are more ints in the file 
    { 
     if (intCount == intList.length) 
      intList = upSizeArr(intList); 
     intList[intCount] = intFile.nextInt(); 
     intCount++; 
    } //END WHILE intFile 

Lors du chargement des mots dans la liste de mots

// P R O C E S S S T R I N G F I L E 
    while (wordFile.ready()) // i.e. while there is another line (word) in the file 
    { 
     if (wordCount == wordList.length) 
      wordList = upSizeArr(wordList); 
     wordList[wordCount] = wordFile.readLine(); 
     wordCount++; 
    } //END WHILE wordFile 
+0

J'ai essayé ceci et j'ai maintenant une erreur "countRunAndMakeAscending". Les mêmes lignes qui ont été référencées avant sont toujours référencées à nouveau –

+0

C'est l'histoire de la programmation logicielle, vous corrigez une erreur et vous passez à la suivante ... Sans trop de contexte, il est difficile de vous aider. Par exemple, s'il vous plaît poster plus d'informations telles que demandées par d'autres dans ce fil. – haoudoin

+0

S'il vous plaît marquer comme réponse si mon message a répondu à votre message original ... merci! :) – haoudoin

1

La console nous indique l'erreur se produit dans indexOfFirstDupe() sur Arrays.sort(). Vous avez deux méthodes avec ce nom, mais étant donné que cette ligne fonctionne très bien nous savons l'erreur se produit après: System.out.format("%s loaded into word array. size=%d, count=%d\n",args[1],wordList.length,wordCount);

Ainsi, l'erreur est Happing dans le indexOfFirstDupe(String[] arr, int count)

Je vois que vous avez importé java.util.*, donc Arrays.sort() devrait être disponible et ne provoque pas l'erreur. Je suppose que 'arr' est nul. Essayez d'imprimer arr à la console en utilisant System.out.println() avant la ligne avec Arrays.sort(arr). Si c'est nul, c'est votre problème.

0

Comment lire des exceptions:

Exception dans le thread "principal" java.lang.NullPointerException

pour les débutants la seule partie importante de cette ligne est la dernière partie (java.lang. NullPointerException) c'est le type de votre erreur. Dans ce cas, vous avez un objet avec null et vous appelez une méthode sur l'objet nul.

à ...

à ...

à Lab4.IndexOfFirsDupe (Lab4.java:144)

à Lab4.main (Lab4.java:66)

il s'agit de la trace de pile. Il vous indique où dans votre code l'erreur est.

Les entrys se composent de trois informations importantes: la classe (lab4), la méthode (IndexOfFirstDupe) et la ligne dans le code (ligne 144)

edit: J'ai écrit ce commentaire avant que le Code a été ajouté