сравнение двух файлов и выдача вывода, какой файл когда-либо имел наибольшее количество

#java

#java

Вопрос:

Проблема с моим кодом в том, что иногда он считывает и сравнивает строку без каких-либо проблем, но опять же он также выдает ошибки при сравнении других строк. Я думаю, что моя функция сравнения недостаточно эффективна, где мне нужно эффективно настроить код, чтобы моя функция сравнения работала эффективно?

может кто-нибудь, пожалуйста, предложить мне что-нибудь? до сих пор я пытался сравнить два файла с помощью bufferedreader. мой код работает в некоторой степени, но в то же время выдает ошибку

«Исключение в потоке «main» java.lang.Исключение StringIndexOutOfBoundsException:»

У меня есть несколько картинок, которые интуитивно описывают мою проблему. Я думаю, что моя функция findtarget недостаточно точна, поэтому она продолжает выдавать эти исключения

ОШИБКА: нажмите здесь, чтобы просмотреть изображение.

ОШИБОК НЕТ: нажмите здесь, чтобы просмотреть изображение.

и вот мои два файла, которые содержат положительные и отрицательные ключевые слова.

ОТРИЦАТЕЛЬНОЕ ЗНАЧЕНИЕ: расширение файла равно negi.txt

ПОЛОЖИТЕЛЬНЫЙ РЕЗУЛЬТАТ: расширение файла равно posi.txt

вот функция findtarget, которая используется для сравнения строк.

 public static int findTarget(String target, String source) 
{

    int target_len = target.length();
    int source_len = source.length();

    int add = 0;

    // this function check the character whether it is present.       
    for (int i = 0; i < source_len;   i) // i is a varialbe used to count upto source_len.
    {

        int j = 0; // take another variable to count loops
        //int[] k = new int[100];

        while (add == 0) 
        {
            if (j >= target_len) // count upto target length
            {
                break;
            } 
            else if (target.charAt(j) != source.charAt(i   j)) 
            {
                break;
            } 
            else 
            {
                  j;
                if (j == target_len) 
                {
                    add  ; // this will return 1: true
                }
            }
        }
    }
    return add;
    //System.out.println("" add);
}
  

вот весь мой код, просто вставьте, если вы хотите их запустить.

 import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.*;
import java.io.FileWriter;


public class test {
    public static int findTarget(String target, String source) 
    {

        int target_len = target.length();
        int source_len = source.length();

        int add = 0;

        // this function check the character whether it is present.       
        for (int i = 0; i < source_len;   i) // i is a varialbe used to count upto source_len.
        {

            int j = 0; // take another variable to count loops
            //int[] k = new int[100];

            while (add == 0) 
            {
                if (j >= target_len) // count upto target length
                {
                    break;
                } 
                else if (target.charAt(j) != source.charAt(i   j)) 
                {
                    break;
                } 
                else 
                {
                      j;
                    if (j == target_len) 
                    {
                        add  ; // this will return 1: true
                    }
                }
            }
        }
        return add;
        //System.out.println("" add);

    }



public static void main(String... args) 
{
// function 1
        //this variable can be called from any place inside this main function.
        int testing1 = 0; 
        int testing2 = 0;
        try {

            //reads user review and store them inside source1
            Scanner sc = new Scanner(System.in);

            System.out.println("Enter your review: ");
            String source1 = sc.nextLine();

            //establising a file object
            File file = new File("posi.txt");
            BufferedReader br1 = new BufferedReader(new FileReader(file));

            //establising a file object
            File file2 = new File("negi.txt");
            BufferedReader br2 = new BufferedReader(new FileReader(file2));

            String target1; // using a string variable to read the content of the file posi.txt

            while ((target1 = br1.readLine()) != null) //as long the condition is not null it will keep printing.
            {      
                testing1  = test.findTarget(target1, source1); // supplying two arguments to findtarget function.
            }

            String target2; // using a string variable to read the content of the file negi.txt

            while ((target2 = br2.readLine()) != null) //as long the condition is not null it will keep printing.
            {                           
                testing2  = test.findTarget(target2, source1); // supplying two arguments to findtarget function.
            }
            br1.close(); br2.close();
            System.out.println("positive is:" testing1  "nnegative is :" testing2); //-not going to print now! :D-
            System.out.println("nthank you for your feedback! :)");

            } 
            catch (IOException e) 
            {
            System.out.println("file error!");
            }


            // this function is an area where it stores the return value inside a file called pos.txt
            try 
            {  
            FileWriter myWriter = new FileWriter("pos.txt",true); 
            // using the true condition makes the line move to the next line.

            myWriter.write(" " testing1);
            myWriter.close();
            } 
            catch (IOException e) 
            {
            System.out.println("An error occurred.");      
            }

            // writing neg inside a file called neg.txt
            try 
            {        
            FileWriter myWriter = new FileWriter("neg.txt",true); 
            // using the true condition makes the line move to the next line.

            myWriter.write(" " testing2);
            myWriter.close();
            } 
            catch (IOException e) 
            {
            System.out.println("An error occurred.");      
            }

        // to evaluate an output based on highest count.
        if(testing1 > testing2)
            System.out.println("it is positive");
        else if (testing1 == testing2)
            System.out.println("it is neutral");
        else
            System.out.println("it is negative"); 
    }    
}
  

Ответ №1:

наконец, я смог решить проблему, используя один из строковых методов, известный как «regionmatches». Примечание: убедитесь, что ваши положительные и отрицательные файлы расположены в алфавитной последовательности. Это даст вам точное приращение.

Github: используйте мою ссылку для загрузки положительных и отрицательных ключевых слов.

 public static int findTarget(String target, String source) //method/function
    {   
       String sourcee = source;
       String targett = target;

        int source_len = sourcee.length(); 
        int target_len = targett.length();     
        /* 
        **this function check the character whether it is present using one of string methond called "regionmatch"
        **regionMatches(int toffset, String other, int ooffset,int len)
        */       
        int add = 0;       
        boolean foundIt = false;    
        for (int i = 0;i <= source_len - 1;i  ) 
        {
           if (sourcee.regionMatches(i, targett, 0, target_len))
           {
              foundIt = true;
              break;
           }
        }      
        //checking 
        if(!foundIt)
        {
            // do nothing.
        }
        else
        {
            add  ;
        }  
        return add; //returns incrementation
    }
  

Ответ №2:

Вы увеличиваете i длину source , но вызываете

 .
.
.
    else if (target.charAt(j) != source.charAt(i   j))
.
.
.
  

которое в какой-то момент превышает длину исходного кода.

Допустим, i == source.length затем source.charAt(i j) сразу же выдает исключение j > 0 .

Комментарии:

1. как мне преодолеть эту проблему? не могли бы вы предоставить пример кода?

2. Я показал вам проблему с вашим кодом. Вам придется продумать весь алгоритм, чтобы избежать этих исключений. Я уверен, что вы можете это сделать.

3. for (int i = 0;i <= source_len - 1;i ) { if (sourcee.regionMatches(i, targett, 0, target_len)) { foundIt ; //System.out.println(sourcee.substring(i, i target_len)); break; } } if (foundIt == 0) { }

4. Вы исправили это с помощью моей подсказки?

5. каким-то образом я это сделал. это работает, я использую метод regionmatches.