1

レベルが別々の.txtファイルに保存されるAndroidでゲームを作成しています。各レベルは、マップ上の異なるアイテムを表す文字のグリッドになりますが、各レベルはさまざまなサイズになるため、ファイルを読み取り、各レベルを 2d に格納する堅牢なコードを作成したいと考えています。そのサイズに関係なく、arraylist。

私の最初の試み:

private void loadLevel(String filename) {
    mapWidth = 0;
    mapHeight = 0;
    BufferedReader br = null;
    try {
        String line = null;
        br = new BufferedReader(new InputStreamReader(mContext.getAssets().open(filename)));
        while ((line = br.readLine()) != null) {
            mapArray.add(getLevelLine(line));
            mapHeight++;
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (br != null)
                br.close();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }
}

private ArrayList<Character> getLevelLine(String line) {
    ArrayList<Character> levelLine = new ArrayList<Character>();
    if (line == null) return levelLine;
    char[] lineArray = line.toCharArray();
    for (char mapPiece : lineArray) {
        levelLine.add(mapPiece);
    }
    mapWidth = lineArray.length;
    return levelLine;
}

mapWidth は行ごとに再計算され、テキスト ファイルの最初の水平行が読み取られ、arraylist の最初の垂直列に格納されるため機能しないため、これは少し非効率的です。ただし、x 座標と y 座標は入れ替わっています。

試行 2:

    private void loadLevel(String filename) {
    mapWidth = 0;
    mapHeight = 0;
    BufferedReader br = null;
    try {
        String line = null;
        br = new BufferedReader(new InputStreamReader(mContext.getAssets().open(filename)));
        while ((line = br.readLine()) != null) {
            mapArray.add(new ArrayList<Character>());
            char lineArray[] = line.toCharArray();
            for (char mapPiece : lineArray) {
                mapArray.get(mapHeight).add(mapPiece);
            }
            mapHeight++;
            mapWidth = lineArray.length;
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (br != null)
                br.close();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }
}

これは同じ方法で mapWidth を計算するので、まだ少し効率が悪いようです。空のエントリを arraylist に追加することで、それぞれの i 番目の要素をループ処理できるようになることが期待されていました。この 2 回目の試行でも、mapHeight が正しく増加しません。これは、最後の反復で mapHeight が増加し、while ループが再度実行されないためですが、while ループの後で mapHeight から 1 を減算しても、何らかの理由で、私は範囲外のインデックス エラーを取得します。さらに重要なことは、mapWidth と mapHeight を手動で設定することにより、2 回目の試行でも、配列リストに格納するときに x 座標と y 座標が入れ替わるように見えることです。

私が見逃している明らかなものはありますか?テキスト ファイルの事前読み取りを必要とせず、通常の char 配列の使用を避ける、比較的簡単な方法があるはずです。

助けてくれてありがとう!

4

1 に答える 1

0

行と列を切り替えた最初の例がなぜなのか、実際にはわかりません。そして、あなたは自分のパフォーマンスを測定しているもので言いませんでした. つまり、速度とメモリ消費のどちらが重要ですか?

とにかく、サンプルのinput.txtファイルを書きました

abcde

フギク

lmnopqr

st

紫外線

w

public class ReadTxtArray {
private final static String filePath = "/home/michael/input.txt";
public static void main(String[] args) {
    try (Scanner s = new Scanner(new BufferedReader(new FileReader(filePath)))) {
        List<List<Character>> rows = new ArrayList<List<Character>>();
        while(s.hasNextLine()) {
            rows.add(createRow(s.nextLine()));
        }
        System.out.println(rows);
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

private static List<Character> createRow(String line) {
    char[] c = line.toCharArray();
    List<Character> chars = Arrays.asList(ArrayUtils.toObject(c));
    return chars;
}

}

[[a, b, c, d, e], [f, g, h, i, g, k], [l, m, n, o, p, q, r, ], [s, t], [u, v], [w]]

これが出力です。それはあなたが望んでいたものですか?

Java 7 の機能に慣れていない場合に備えて、try with resources ブロックを使用しています。残念なことに、Android ではまだ利用できません。本当の恥...

于 2013-10-25T17:08:38.477 に答える