2016-09-30 2 views
-4

Ich führe einen Code, der eine Liste von Ints und eine Liste von Zeichenfolgen, und erhöht separat die Größe des Arrays auf die richtige Größe und sortiert dann das Array in einer anderen Methode während Sie dann auch eine Instanz eines Duplikats finden. Der Code ist bis zu dem Punkt in Ordnung, wo ich die Methoden ausführen, wo es mein Array sortiert und nach Duplikaten sucht. Ich weiß, was die richtige Ausgabe sein sollte, und es sollte kein Duplikat in intList und ein Duplikat in WordList unter Index 45788 gefunden werden. Ich habe um Hilfe von anderen gebeten, die diese einfache Aufgabe ausführen und denselben Code wie sie haben. Ich muss irgendwo weg sein, aber ich kann nicht finden wo. Ich habe ein Foto der beiden Methoden neben der Ausgabe in der Eingabeaufforderung angefügt. Vielen Dank für jede HilfeJava Run Fehler bei Code, der funktioniert

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

Wenn es „run Fehler“, dass es nicht „Code, der funktioniert“ sein können und umge versa – Antoniossss

+0

Fügen Sie Ihren Code zu der Frage statt die Bilder. – TimeToCode

+2

Sie zeigten die Ausnahme (in einem Bild anstelle von Kopieren und Einfügen) und zeigte dann nicht einmal die Zeile, auf die es verweist (Zeile 144, in indexOfFirstDupe) ... – jonhopkins

Antwort

1

Überarbeitete Antwort:

Nach genauerer Betrachtung. Es scheint, dass die Arrays.sort() schuld ist. Eine Möglichkeit besteht darin, dass die Array-Größen um "upSizeArr" erhöht werden. Oder wordFile.readLine() gibt einen Nullwert zurück, wenn Wörter zum Array wordList hinzugefügt werden. Was auch immer der Grund ist, der "countRunAndMakeAscending" -Fehler ist hauptsächlich auf null Werte in dem zu sortierenden Array zurückzuführen.sowie

Andere haben in dieser Frage lautete:

Sorting an array of strings in Java

Der Vorschlag ist eine Arraylist zu verwenden.

Alternativ dazu kann das Durchlaufen der Arrays und das Festlegen von NULL-Werten auf einen Wert ungleich null vor dem Sortieren das Problem lösen. Sie müssen jedoch einen guten Nicht-Null-Wertkandidaten ermitteln, der den Datensatz beim Suchen nach Duplikaten in der Methode "indexOfFirstDupe" nicht beschädigt.

Also, lernen, die ArrayList zu verwenden, könnte der leichtere Weg sein.

Die alte Lösung bleibt bestehen, da sie ein separates Problem in Ihrem Code löst.

Alte Antwort:

Es sieht aus wie Ihr Code einen Nullwert zu stoßen, wenn sie durch die Wortliste Array Looping. Beim Durchsehen Ihres Codes scheint das Problem möglicherweise auch in der Liste "int" vorhanden zu sein. Also ... ein paar Dinge zu korrigieren. Ändern Sie die Art und Weise, wie Sie Ints und Wörter in die Arrays setzen, indem Sie die Variablen intCount und wordCount in den while-Schleifen inkrementieren.

Wenn Ints in die intList geladen ...

// 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 

Wenn Worte in der Wortliste Laden

// 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

Ich habe das versucht und habe jetzt einen "countRunAndMakeAscending" -Fehler. Die gleichen Zeilen, auf die zuvor verwiesen wurde, werden immer noch referenziert –

+0

Das ist die Geschichte mit der Software-Programmierung, Sie beheben einen Fehler und Sie gehen zum nächsten ... Ohne viel Kontext ist es schwer, Ihnen zu helfen. d. h. Bitte posten Sie weitere Informationen wie von anderen in diesem Thread angefordert. – haoudoin

+0

Bitte als Antwort markieren, wenn mein Post Ihren ursprünglichen Beitrag beantwortet hat ... Danke! :) – haoudoin

1

Die Konsole sagt uns der Fehler geschieht in indexOfFirstDupe() auf Arrays.sort(). Sie haben zwei Methoden mit diesem Namen, aber da diese Linie fein läuft wissen wir, der Fehler passiert, nachdem es: System.out.format("%s loaded into word array. size=%d, count=%d\n",args[1],wordList.length,wordCount);

So ist der Fehler in der indexOfFirstDupe(String[] arr, int count)

happing I sehen Sie java.util.* importiert haben, so sollten Arrays.sort() sein verfügbar und verursacht den Fehler nicht. Ich würde vermuten, dass 'arr' null ist. Versuchen Sie, arr mit System.out.println() vor der Zeile mit Arrays.sort(arr) auf der Konsole zu drucken. Wenn es null ist, ist das dein Problem.

0

Wie Ausnahmen zu lesen:

Exception in thread "main" java.lang.NullPointerException

für Anfänger der nur wichtiger Teil dieser Linie ist der letzte Teil (java.lang. NullPointerException) Dies ist der Typ Ihres Fehlers. In diesem Fall haben Sie ein Objekt mit dem Wert null und Sie versuchen, eine Methode für das Nullobjekt aufzurufen.

bei ...

bei ...

bei Lab4.IndexOfFirsDupe (Lab4.java:144)

bei Lab4.main (Lab4.java:66)

Dies ist der sogenannte Stack-Trace. Es zeigt Ihnen, wo in Ihrem Code der Fehler liegt.

Die entrys bestehen aus drei wichtigen Informationen: Die Klasse (lab4), wobei das Verfahren (IndexOfFirstDupe) und die Zeile im Code (Linie 144)

edit: Ich schrieb diesen Kommentar, bevor der Code hinzugefügt wurde