Проверить, является ли строка равной или подстрокой другой

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

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Scanner;


public class Comparison {

    static void compare() throws FileNotFoundException {

        Scanner queries = new Scanner(new FileReader("./out.txt"));
        Scanner folks = new Scanner(new FileReader("./tal.txt"));
        int index1 = 0;
        while ( queries.hasNextLine() ){
            String check = queries.next();

            while (folks.hasNextLine()) {
                String toCheck = folks.next();
                index1 = toCheck.indexOf(check);
            }//while
        }//while

        System.out.println("Result: "+ index1);
    }
}

Но я получаю ошибку ниже:

Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Scanner.java:838)
    at java.util.Scanner.next(Scanner.java:1347)
    at results.Comparison.compare(Comparison.java:28)
    at results.Main.main(Main.java:42)

В чем проблема? Как я могу заставить его работать?


person user758084    schedule 20.09.2011    source источник
comment
Вы уверены, что ссылаетесь на правильный файл? Ссылаться на файлы, внешние по отношению к пути к классам, только с помощью ./[...] опасно.   -  person home    schedule 20.09.2011
comment
static void compare() выдает правильную ссылку на файл FileNotFoundException...   -  person user758084    schedule 20.09.2011
comment
Кстати: ваше сравнение интересно - оно будет печатать только последнее найденное совпадение.   -  person home    schedule 20.09.2011


Ответы (2)


Инициализация folks должна быть внутри внешнего цикла, например:

        Scanner queries = new Scanner(new FileReader("./out.txt"));
        int index1 = 0;
        while ( queries.hasNextLine() ){
            String check = queries.next();
            Reader r = new FileReader("./tal.txt");
            try {
                Scanner folks = new Scanner(r);
                while (folks.hasNextLine()) {
                    String toCheck = folks.next();
                    index1 = toCheck.indexOf(check);
                    if (index1 >= 0) {
                        // Do something with index1 here?
                    }
                }//while
            } finally {
                r.close();
            }
        }//while
person finnw    schedule 20.09.2011
comment
теперь я получаю ошибку ниже: Исключение в потоке main java.io.FileNotFoundException: ./NetBeansProjects/Results/tags_disticts_opacial.txt (слишком много открытых файлов) в java.io.FileInputStream.open (собственный метод) в java.io.FileInputStream .‹init›(FileInputStream.java:106) в java.io.FileInputStream.‹init›(FileInputStream.java:66) в java.io.FileReader.‹init›(FileReader.java:41) в results.Comparison. сравнить (Comparison.java: 27) в results.Main.main (Main.java: 42) - person user758084; 20.09.2011
comment
@ user758084, я немного удивлен, что вы получили эту ошибку, но я обновил код, чтобы все читатели были закрыты как можно скорее. Попробуй это сейчас. - person finnw; 20.09.2011

Я думаю, вам нужно использовать nextLine(), а не next(). Как в:

String check = queries.nextLine();

а также:

String toCheck = folks.nextLine();

Поскольку разделителем по умолчанию является пробел, если у вас есть пустая строка в конце файла (и, возможно, что-то еще), может не быть next(), даже если функция hasNextLine() возвращает значение true. Всегда используйте метод hasNext*(), соответствующий методу next*(), который вы используете - (и наоборот ;-)).

person Ed Staub    schedule 20.09.2011