18.11.2013 10:34
 0просмотров 34 0

Исключение удалённых и заблокированных персонажей. Часть2.

В этой статье я покажу один из вариантов использования файла со списком исключений.

Для этого создадим новый класс. Назовём его ExceptionHeroFile. Для вытаскивания информации из файла потребуются следующие инструменты:

    File F;
    FileInputStream Input;
    InputStreamReader IReader;
    BufferedReader Reader;


Это по порядку: файл, поток, в который он загружается, ридер, который читает из потока и BufferedReader (не знаю как это расшифровать), который преобразует прочитанную информацию в удобный вид и передаёт её необходимыми порциями. В конструкторе класса произведём инициализацию всех этих объектов. В качестве параметра передадим конструктору название файла, в котором список исключений.

    public ExceptionHeroFile(String fileName) {
        Input = null;
        try {
            F = new File(fileName);
            Input = new FileInputStream(F);
            IReader = new InputStreamReader(Input);
            Reader = new BufferedReader(IReader);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }


И определим один метод, который будет возвращать следующий id в файле. В файле информация лежит построчно, значит для её чтения будем использовать метод readLine(). Когда файл закончится, возвращать будем -1.

    public int getNextID() {
        int result = -1;
        
        try {
            result = Integer.parseInt(Reader.readLine());
            if (result < 0) result *= -1;
        } catch (Exception ex) {}
        
        return result;
        
    }


Этот класс позволяет исключать из перебора id в списке, причём не нужно в память загружать весь более чем 40-мегабайтовый файл с исключениями. Ну и пример использования этого класса:

Инициализация:
        int start = 1;
        int stop = 5571073;

        ExceptionHeroFile blockedFile = new ExceptionHeroFile("blocked.txt");
        int blockedID = blockedFile.getNextID();


Ищем в файле первый id больше начального:
        while (blockedID < start) {
            blockedID = blockedFile.getNextID();
            if (blockedID == -1) break;
        }


Собственно цикл с исключением:
        for (int i = start; i < stop; i++) {
            
            if (i == blockedID) {
                blockedID = blockedFile.getNextID();
                continue;
            }
            ...
        }


P.S. Для того, чтобы это всё работало, файл должен быть отсортирован. В тех файлах, ссылки на которые я приводил, информация уже отсортирована. Но если будете там что-то дополнять, необходимо это учесть.

Возможность комментировать доступна после регистрации