#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.