将.text文件读入2d arraylist

时间:2013-10-25 12:29:05

标签: java android arrays arraylist readfile

我在android中创建一个游戏,其中的关卡将存储在单独的.txt文件中。每个级别都是一个字符网格,表示地图上的不同项目,但每个级别的大小都不一样,所以我想创建一个强大的代码段来读取文件,并将每个级别存储在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个元素。第二次尝试也没有正确地增加mapHeight,因为在最后一次迭代中,mapHeight将会增加,然后while循环将不会再次执行,但由于某种原因,即使我在while循环后从mapHeight中减去1,我获取索引超出范围的错误。 更重要的是,通过手动设置mapWidth和mapHeight,我的第二次尝试似乎仍然在将x和y坐标存储到arraylist时交换。

我有什么明显的遗失吗?似乎应该有一种相对简单的方法,不需要预先读取文本文件,并避免使用普通的char数组。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我实际上无法理解为什么你是第一个例子,你已经切换了行和列。 而你没有说你正在测量你的表现。我的意思是什么对你更重要 - 速度或内存消耗?

无论如何我写了一个示例input.txt文件

a b c d e

f g h i g k

l m n o p q r

s t

你v

瓦特

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功能。很遗憾,它仍然没有在Android上可用。真是羞耻......