2012-03-29 3 views
-2

Я создаю поисковую систему, которая читает в текстовом файле, и печатает слово, которое пользователь может искать. В настоящее время я создаю индекс массивов для поиска. Более подробную информацию можно найти здесь: http://cis-linux1.temple.edu/~yates/cis1068/sp12/homeworks/concordance/concordance.htmlCannnot find "Array Out of Bounds Exception" Java

Когда я запускаю эту программу прямо сейчас, я получаю «Array индекс вне границ Exception»

Исключение в потоке «основной» java.lang.ArrayIndexOutOfBoundsException: 43 в SearchEngine.main (SearchEngine.java:128)

Может ли кто-нибудь помочь отладить?

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


public class SearchEngine { 


public static int getNumberOfWords (File f) throws FileNotFoundException { 
    int numWords = 0; 
    Scanner scan = new Scanner(f); 
    while (scan.hasNext()) { 
    numWords++; 
    scan.next(); 
    } 
    scan.close(); 

    return numWords; 
} 

public static void readInWords (File input, String [] x) throws FileNotFoundException { 
    Scanner scan = new Scanner(input); 
    int i = 0; 
    while (scan.hasNext() && i<x.length) { 
     x[i] = scan.next(); 
     i++; 
     } 
    scan.close(); 
} 

public static int getNumOfDistinctWords (File input, String [] x) throws FileNotFoundException { 
    Scanner scan = new Scanner(input); 
    int count = 0; 
    int i = 1; 
    while (scan.hasNext() && i<x.length) { 
    if (!x[i].equals(x[i-1])) { 
    count++; 
    } 
    i++; 
    } 
    scan.close(); 
    return count; 
} 

public static void readInDistinctWords (String [] x, String [] y) { 
    int i = 1; 
    int k = 0; 
    while (i<x.length) { 
     if (!x[i].equals(x[i-1])) { 
     y[k] = x[i]; 
     k++; 
     } 
    i++; 
    } 
} 

public static int getNumberOfLines (File input) throws FileNotFoundException { 
    int numLines = 0; 
    Scanner scan = new Scanner(input); 
    while (scan.hasNextLine()) { 
     numLines++; 
     scan.nextLine(); 
     } 
    scan.close(); 
    return numLines; 
} 

public static void readInLines (File input, String [] x) throws FileNotFoundException { 
    Scanner scan = new Scanner(input); 
    int i = 0; 
    while (scan.hasNextLine() && i<x.length) { 
     x[i] = scan.nextLine(); 
     i++; 
     } 
    scan.close(); 
} 

Главная

public static void main(String [] args) { 

try { 

    //gets file name 
System.out.println("Enter the name of the text file you wish to search"); 
    Scanner kb = new Scanner(System.in); 
    String fileName = kb.nextLine(); 
    String TXT = ".txt"; 
    if (!fileName.endsWith(TXT)) { 
     fileName = fileName.concat(TXT); 
    } 

    File input = new File(fileName); 

//First part of creating index 
System.out.println("Creating vocabArray"); 
int NUM_WORDS = getNumberOfWords(input); 
//System.out.println(NUM_WORDS); 
String [] wordArray = new String[NUM_WORDS]; 
readInWords(input, wordArray); 
Arrays.sort(wordArray); 
int NUM_DISTINCT_WORDS = getNumOfDistinctWords(input, wordArray); 
String [] vocabArray = new String[NUM_DISTINCT_WORDS]; 
readInDistinctWords(wordArray, vocabArray); 
System.out.println("Finished creating vocabArray"); 



System.out.println("Creating concordanceArray"); 
int NUM_LINES = getNumberOfLines(input); 
String [] concordanceArray = new String[NUM_LINES]; 
readInLines(input, concordanceArray); 
System.out.println("Finished creating concordanceArray"); 



System.out.println("Creating invertedIndex"); 
int [][] invertedIndex = new int[NUM_DISTINCT_WORDS][10]; 
int [] wordCountArray = new int[NUM_DISTINCT_WORDS]; 
int lineNum = 0; 
    while (lineNum<concordanceArray.length) { 
     Scanner scan = new Scanner(concordanceArray[lineNum]); 
     while (scan.hasNext()) { 
      int wordPos = Arrays.binarySearch(vocabArray, scan.next()); 
      wordCountArray[wordPos]+=1; 
      for(int i = 0; i < invertedIndex.length; i++) { 
      for(int j = 0; j < invertedIndex[i].length; i++) { 
      if (invertedIndex[i][j] == 0) { 
      invertedIndex[i][j] = lineNum; 
      break; 
      } } } 
      } 
     lineNum++; 
     } 
System.out.println("Finished creating invertedIndex"); 

} 

    catch (FileNotFoundException exception) { 
    System.out.println("File Not Found"); 
} 




} //main 

} // класс

+1

где вы получаете исключение hte? – hvgotcodes

+0

Определить «не удается найти»; исключение покажет вам, где именно происходит ошибка. –

+0

Исключение в потоке «основного» java.lang.ArrayIndexOutOfBoundsException: 43 \t в SearchEngine.main (SearchEngine.java:128) – user1302023

ответ

6
for(int j = 0; j < invertedIndex[i].length; i++) { 

, вероятно, следует

j++ 

не

i++ 

Обновление после исправления.

Это означает, что Arrays.binarySearch(vocabArray, scan.next()) не находит элемент для поиска. Вы не можете предположить, что у vocabArray есть предмет, который вы ищете. Вам нужно будет добавить if(... < 0) для вызова binarySearch.

+0

исправил его до j ++, и теперь я получаю это: – user1302023

+0

Исключение из потока «main» java.lang.ArrayIndexOutOfBoundsException: -1 в SearchEngine.main (SearchEngine.java:126) – user1302023

+0

Но если вы будете следовать этому коде, он в основном принимает каждое слово из txt-файла и добавляет его в vocabArray. Затем он берет каждую строку из файла, добавляет ее в concordanceArray. Бинарный поиск выполняет поиск каждого слова в каждой строке concordanceArray и возвращает индекс в vocabArray, где он найден. Итак, теоретически, вокабарит должен иметь это. – user1302023