5

実際の問題はもう少し下で対処されます:)、ありがとう。

私は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ファイルの情報を正しくチェックしないことです。何もソートせずに、何度も何度も観察したものを保存するだけなので、それがわかります。これは私の限られた知識で考えることができる唯一の方法であり、それはうまくいきませんでした。

疑問に思っている人のために:これは、RuneScapeと呼ばれるゲームをプレイするRSbotと呼ばれるボットのスクリプトです。私は実際にはボットを使用していませんが、演習のためにこれを使用したかったのです。

それでさらに問題が解決する場合は、スクリプト全体を貼り付けることができます。

私は本当にどんな助けにも感謝します、そしてもちろん私が使った答えを選ぶことを忘れないでしょう(誰かが助けてくれるのをわざわざするなら;))。

ありがとう。

4

2 に答える 2

6
for(String monster : monstersToAdd){    
    if(line.contains(monster)){
        monstersToAdd.remove(monster);
    }
}

ConcurrentModificationExceptionif line.contains(monster)isをスローしtrue、をmonstersToAdd含みますmonster反復中にコレクションから要素を削除する唯一Iterator安全な方法は、次を使用することです。

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

編集

@truthealityは指摘します

実際、同じことを達成するためのはるかに簡単な方法はmonstersToAdd.removeAll(line);

forしたがって、ループを1行のコードに置き換えることができます。

于 2011-06-15T19:31:28.443 に答える
0

考えられる問題の 1 つは、「保存」するときに同じファイルを上書きしているように見えることです。あるファイルから読み取り、別のファイルに書き込むテストを実行することをお勧めします。

ファイルに追加するには、いくつかのオプションがあります。

  1. 2 つの関数で 'RandomAccessFile` を共有します。これにより、最初の関数がファイルの読み取りを完了した後、カーソルがファイルの末尾にあり、2 番目の関数がそこから書き込みを続行してファイルに追加できます。
  2. 2 番目の関数でaRandomAccessFileを開き、書き込む前にカーソルをファイルの最後に移動します (たとえば、行がなくなるまでファイル内のすべてを読み取る)。
于 2011-06-15T19:39:46.193 に答える