2013-03-04 3 views
0

У меня проблема с программой, которую я пытаюсь закодировать. В основном он читает из двух файлов, преобразует их в массивы и сравнивает сходства. Он работал, когда до сих пор, но когда первый файл .txt читает «abcdefghijaaaaaa» и второй файл .txt читает «abcdefghik», я получаю следующее сообщение об ошибке после ввода имен файлов:Детектор плагиата

java.lang.ArrayIndexOutOfBoundsException: 10 
    at PlagiarismDetector.compareStrings(PlagiarismDetector.java:77) 
    at PlagiarismDetector.main(PlagiarismDetector.java:25) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272) 

Мой код следующим образом. Благодаря тому, кто может помочь =)

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

    public class PlagiarismDetector 
    { 
     public static void main(String[] args) { 
    Scanner reader = new Scanner(System.in); 
    System.out.println("What file is the first file?"); 
    String fileOne = reader.next(); 

    String stringOne = readStringFromFile(fileOne); 

    System.out.println("What file is the second file?"); 
    String fileTwo = reader.next(); 
    String stringTwo = readStringFromFile(fileTwo); 

    if (stringOne == null || stringTwo == null) 
    { 
     return; 
    } 

    System.out.println("Comparing the 2 files......"); 
    System.out.println("The result of the 2 files is ...."); 

    if (compareStrings(stringOne, stringTwo)) 
    { 
     System.out.println("Plagiarism detected. Cheaters!!!!"); 
    } 
    else 
    { 
      System.out.println("No plagiarism detected"); 
      } 
     } 

     public static String readStringFromFile(String filename) 
     {enter code here 
    String builder = ""; 
    try 
    { 
     Scanner fileReader = new Scanner(new File(filename)); 
     while (fileReader.hasNextLine()) 
     { 
     builder = builder + fileReader.nextLine() + "\n"; 
     } 

     return builder; 
    } 
    catch (Exception e) 
    { 
     System.out.println("An error occurred while trying to open the file " + filename + ". Is the file located inside the same folder as the .class file and with the identical name?"); 
     return null; 
    } 
     } 

     public static boolean compareStrings (String a, String b) 
    { 
     boolean checkForPlagiarism = true; 
     String[] piecesA = a.split("\\s"); 
     String[] piecesB = b.split("\\s"); 

     int count1 = 0; 
     int count2 = 0; 
     for (int counter = 0; counter <= piecesA.length - 1; counter++) 
     { 
      for(int counter2 = 0; counter<= piecesB.length - 1; counter++) 
      { 
       if(piecesA[counter].equals(piecesB[counter2])) 
       { 
       count1++; 
       } 
      } 
     } 
     for (int counter = 0; counter <= piecesB.length - 1; counter++) 
     { 
      for(int counter2 = 0; counter <= piecesA.length - 1; counter++) 
      { 
       if(piecesA[counter].equals(piecesB[counter])) 
       { 
       count2++; 
       } 
      } 
     } 

     if((count1/(int)piecesA.length)*100 >= 90 && (count2/(int)piecesB.length)*100 >= 90) 
     { 
     checkForPlagiarism = false; 
     }  
     return checkForPlagiarism; 
     } 
    } 

ответ

1

Это выглядит suspitius:

for (int counter = 0; counter <= piecesB.length - 1; counter++) 
{ 
    for(int counter2 = 0; counter <= piecesA.length - 1; counter++) 
    { 
     if(piecesA[counter].equals(piecesB[counter])) 
     { 
      count2++; 
     } 
    } 
} 

Счетчики ограничены по длине неправильного массива

Вы, вероятно, хотите сделать это:

for (int counter = 0; counter <= piecesA.length - 1; counter++) 
{ 
    for(int counter2 = 0; counter2 <= piecesB.length - 1; counter2++) 
    { 
     if(piecesA[counter].equals(piecesB[counter2])) 
     { 
      count2++; 
     } 
    } 
} 

Также конвенция заключается в том, чтобы писать петли следующим образом:

for(int counter2 = 0; counter2 < piecesB.length; counter2++) 
2
  if(piecesA[counter].equals(piecesB[counter])) 

должен быть

  if(piecesA[counter2].equals(piecesB[counter])) 
Смежные вопросы