从csv文件中读取

时间:2016-02-29 15:47:25

标签: java csv arraylist

这是我在大学工作的一个项目,除了初始化游戏的游戏课外,一切似乎都很好。这是一个片段

public class Game{
 private Player                         player;
 private World                          world;
 private ArrayList<NonPlayableFighter>  weakFoes;
 private ArrayList<NonPlayableFighter>  strongFoes;
 private ArrayList<Attack>              attacks;
 private ArrayList<Dragon>              dragons;

public Game() throws IOException{
    player      = new Player("");
    world       = new World();
    weakFoes    = new ArrayList<NonPlayableFighter>();
    strongFoes  = new ArrayList<NonPlayableFighter>();
    attacks     = new ArrayList<Attack>();
    dragons     = new ArrayList<Dragon>();
    loadAttacks ("Database-Attacks_20309.csv");
    loadFoes    ("Database-Foes_20311.csv");
    loadDragons ("Database-Dragons_20310.csv");
}

之后是一些吸气剂和我应该实施的4方法。 这些方法是loadCSV(String filePath)loadAttacks(String filePath)loadFoes(String filePath)loadDragons(String filePath)
我创建了loadCSV(String filePath),使得它返回String []的ArrayList:

private ArrayList<String[]> loadCSV(String filePath) throws IOException{
    String currentLine          = ""; 
    ArrayList<String[]> result  = new ArrayList<String[]>();
    FileReader fileReader       = new FileReader(filePath); 
    BufferedReader br           = new BufferedReader(fileReader); 
    currentLine                 = br.readLine();
    while (currentLine != null){ 
        String[] split = currentLine.split(",");
        result.add(split);
    }
    br.close();
    return result;
}

然后我想加载一些攻击,敌人和龙,并将它们插入相应的ArrayList中 我在这里申请了loadAttacks(String filePath)

private void loadAttacks(String filePath) throws IOException{
    ArrayList<String[]> allAttacks = loadCSV(filePath);
    for(int i = 0; i < allAttacks.size(); i++){
        String[] current = allAttacks.get(i);
        Attack temp = null;
        switch(current[0]){
            case "SA": temp = new SuperAttack(current[1], 
                    Integer.parseInt(current[2]));
                    break;
            case "UA": temp = new UltimateAttack(current[1], 
                    Integer.parseInt(current[2]));
                    break;
            case "MC": temp = new MaximumCharge();
                    break;
            case "SS": temp = new SuperSaiyan();
                    break;
        }
        attacks.add(temp);
    }
}

我写了它,它从loadCSV(String filePath)返回ArrayList,并使用一个开关搜索第一个String上的ArrayList中的每个String [],从而创建适当的攻击并将其添加到攻击中。
然后我想为Foes读取另一个CSV,并且CSV文件的结构使得在第一行有一些属性,第二行有些类型的SuperAttack攻击,第三行有一些类型的Ultimate攻击攻击。同样在每个敌人中都有一个布尔属性,用于确定它是强者还是弱者,从而将其置于正确的Arraylist中。以下是loadFoes(String filePath)的代码:

private void loadFoes(String filePath) throws IOException{
    ArrayList<String[]> allFoes = loadCSV(filePath);
    for(int i = 0; i < allFoes.size(); i += 3){
        String[] current                            = allFoes.get(i);
        String[] supers                             = allFoes.get(i+1);
        String[] ultimates                          = allFoes.get(i+2);
        ArrayList<SuperAttack> superAttacks         = new ArrayList<SuperAttack>();
        ArrayList<UltimateAttack> ultimateAttacks   = new ArrayList<UltimateAttack>();
        NonPlayableFighter temp = null;
        for(int j = 0; i < supers.length; j++){
            int index = attacks.indexOf(supers[j]);
            if(index != -1){
                superAttacks.add((SuperAttack)attacks.get(index));
            }
            else break;
        }
        for(int j = 0; i < ultimates.length; j++){
            int index = attacks.indexOf(ultimates[j]);
            if(index != -1){
                ultimateAttacks.add((UltimateAttack)attacks.get(index));
            }
            else break;
        }
        if(current[7].equalsIgnoreCase("True")){
            temp = new NonPlayableFighter(current[0], Integer.parseInt(current[1]), 
                            Integer.parseInt(current[2]), Integer.parseInt(current[3]), 
                            Integer.parseInt(current[4]), Integer.parseInt(current[5]), 
                            Integer.parseInt(current[6]), true, superAttacks, ultimateAttacks);

            strongFoes.add(temp);
        }
        else{
            temp = new NonPlayableFighter(current[0], Integer.parseInt(current[1]), 
                            Integer.parseInt(current[2]), Integer.parseInt(current[3]), 
                            Integer.parseInt(current[4]), Integer.parseInt(current[5]), 
                            Integer.parseInt(current[6]), false, superAttacks, ultimateAttacks);

            weakFoes.add(temp);
        }
    }
}

首先,我从loadCSV(String filePath返回的ArrayList中获取前三个String []并进行2次循环以检查攻击是否在先前加载的攻击CSV中,然后我检查确定它是否为a的属性强或弱并相应地创建一个新的NonPlayableFighter并将其添加到适当的列表中。

为此赋值运行jUnit4测试,它给出了一个编译错误:未处理的异常类型IOException。一般来说,代码是否有任何明显的问题?

3 个答案:

答案 0 :(得分:0)

如果不是任务的一部分,最好重新使用已存在的Java文件阅读器(例如CVSReader)。

答案 1 :(得分:0)

这会产生很多代码。我将回答您的编译错误。

在阅读文件时,您必须在try catch中填写代码以避免此类错误。在loadCSV方法中,您必须设置一个try catch块。

有关完整教程,请参阅this site

try (BufferedReader br = new BufferedReader(new FileReader("C:\\testing.txt")))
    {

        String sCurrentLine;

        while ((sCurrentLine = br.readLine()) != null) {
            String[] split = currentLine.split(",");
            result.add(split);
        }

    } catch (IOException e) {
        e.printStackTrace();
    } 

简而言之,访问文件的代码必须在try catch中以避免IO异常,或者在抛出异常的方法中(但必须在其他地方捕获)。

在该代码中,您有一个很好的资源尝试示例,非常好的方法来管理您的资源和内存。

答案 2 :(得分:0)

loadCSV(String filePath)是一个无限循环不是吗?至于IOException,它作为@RPresle建议使用try / catch来解决BufferedReader的问题。