Java - сравнение строки в ArrayList со всем текстом в файле .txt - PullRequest
5 голосов
/ 15 июня 2011

Актуальная проблема будет решена чуть ниже :), спасибо.

Я довольно новичок в Java (почти через книгу на 400 страниц).

Я пока не очень знаком с API.

Это мой лучший способ прочитать файл .txt и проверить, есть ли какие-либо собранные данные, которые уже сохранены в файле .txt. В этом случае данные будут удалены из коллекции данных и будут добавлены данные, которые еще не найдены в .txt.

Некоторые переменные:

public String[] names;
public int[] levels;
public int[] IDs;

public ArrayList<String> line = new ArrayList<String>();
public ArrayList<RSNPC> monsterList = new ArrayList<RSNPC>();
public ArrayList<String> monstersToAdd = new ArrayList<String>();

Метод, который проверяет существующий файл .txt:

    private void checkForLine() {
     try{
         // Create file 
        File file = new File(getCacheDirectory() + "output.txt");
        RandomAccessFile out = new RandomAccessFile(file, "rw");
        for(int i = 0; i < file.length(); i++){
            line.add(out.readLine());
        }
        for(String monster : monstersToAdd){    
            if(line.contains(monster)){
                monstersToAdd.remove(monster);
            }
        }
        //Close the output stream
        out.close();
     }catch (Exception e){//Catch exception if any
         System.err.println("Error: " + e.getMessage());
         }
     }

Метод, который в конечном итоге сохраняет информацию, определенную checkForLine () (которая уже отсутствует в файле):

private void saveToFile() {
     try{
         // Create file 
        BufferedWriter out = new BufferedWriter(new FileWriter(getCacheDirectory() + "output.txt"));
        for(String a : monstersToAdd){
            out.write(a);
            out.newLine();
            log("Wrote " + a + "to file");
        }
         //Close the output stream
         out.close();
         }catch (Exception e){//Catch exception if any
         System.err.println("Error: " + e.getMessage());
         }
     }

Порядок исполнения:

        getNPCS();
    getNames(monsterList);
    getLevels(monsterList);
    getIDs(monsterList);
    combineInfo();
    checkForLine();
    saveToFile();

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

Для тех, кому интересно: Это скрипт для бота по имени RSbot, который играет в игру под названием RuneScape. На самом деле я не использую бота, но я хотел сделать это для упражнения.

Я могу вставить весь сценарий, если это прояснит ситуацию.

Я действительно ценю любую помощь, и, конечно, не забуду выбрать ответ, который я использовал (если кто-то не поможет;)).

Спасибо.

Ответы [ 2 ]

6 голосов
/ 15 июня 2011
for(String monster : monstersToAdd){    
    if(line.contains(monster)){
        monstersToAdd.remove(monster);
    }
}

выдает ConcurrentModificationException, если line.contains(monster) равно true, а monstersToAdd содержит monster. Безопасный способ удаления элемента из коллекции во время итерации - only - Iterator:

for(Iterator<String> iter = monstersToAdd.iterator(); iter.hasNext();){
    String monster = iter.next();
    if (line.contains(monster)) iter.remove();
}

Edit

@ trutheality указывает

На самом деле, гораздо более простой способ сделать то же самое - monstersToAdd.removeAll(line);

Таким образом, вы можете заменить for цикл с одной строкой кода.

0 голосов
/ 15 июня 2011

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

Чтобы добавить файл, у вас есть несколько вариантов:

  1. две функции совместно используют «RandomAccessFile», таким образом, после того, как первая закончит чтение файла, курсор находится в конце файла, и вторая функция может продолжить запись оттуда, добавляя в файл
  2. Откройте RandomAccessFile во второй функции и перед записью переместите курсор в конец файла (например, прочитав все в нем, пока не останется больше строк).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...