当前位置: 首页 > 知识库问答 >
问题:

正在读取csv文件

李招
2023-03-14

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

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");
}

之后是一些getter和我要实现的4个方法。这些方法是LoadCSV(String filePath)LoadAttacks(String filePath)LoadFoes(String filePath)LoadDragons(String filePath)
我创建了LoadCSV(String filePath),以便它在此处返回String[]的数组列表:

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;
}

然后,我想加载一些攻击、敌人和龙,并将它们插入相应的数组列表中。
我在此处应用了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,并使用开关在ArrayList中的每个String[]中搜索第一个字符串,从而创建适当的攻击并将其添加到攻击中。
然后我想为敌人读取另一个CSV,CSV文件的结构是这样的,在第一行中有一些属性,第二行有一些类型为超级攻击的攻击,第三行有一些类型为终极攻击的攻击。此外,在每个foe中都有一个布尔属性来确定它是强的还是弱的foe,从而将它放在正确的数组列表中。下面是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[],并进行了两次循环,以检查攻击是否在先前加载的攻击CSV中,然后检查确定其是强还是弱的属性,并相应地创建一个新的NonplayableFighter并将其添加到相应的列表中。

运行此赋值的jUnit4测试时,会给出一个编译错误:未处理的异常类型IOException。一般来说,代码有什么值得注意的问题吗?

共有1个答案

袁亦
2023-03-14

如果不是您任务的一部分,那么最好重用已经存在的用于Java的CSV文件读取器(例如CVSReader)。

 类似资料:
  • 问题内容: 我正在开发一个概念验证应用程序,以便可以在我正在开发的更大的应用程序中实现该功能。我对Java和Android Dev有点陌生,但希望这个问题不会太简单或太复杂。 基本上,我正在尝试从CSV文件中读取字符串列表,并使其可用于在应用程序的主活动中显示该列表。 我正在使用外部类来读取CSV文件。这是课程代码: CSVFile.java 这是我的主要活动代码: MainActivity.ja

  • 我想从多列csv文件中读取特定列,并使用Java在其他csv文件中打印这些列。需要帮忙吗?下面是我逐行打印每个令牌的代码。。但我希望只打印多列csv中的几列。

  • 我是R的新手,想读一个csv文件。但是当我试图阅读它时,我遇到了错误。我的csv文件如下: 当我在RStudio中使用此命令时,我得到了错误:命令: 错误: 读取时出错。表(file=file,header=header,sep=sep,quote=quote,:不允许重复的“row.names” 我还尝试删除错误并使用此命令: 但是当我查看输出时,它不能保持方阵的结构。你能帮我做什么吗?

  • 看起来有点讽刺,但当我读2GB的时候。csv文件逐行使用BufferedReader,耗时约4.5秒。我用大约230MB的gzip压缩了文件。我使用了用BufferedReader包装的GZIPInputStream来读取。gz文件。大约用了8.5秒。 我知道InputStream接口读取的是字节数据,而不是读卡器,但我认为如果一个200MB的文件加载到内存会更快。是否可以使用实现更好的性能。gz

  • 问题内容: [编辑] 我使用 D3 解决了这个问题,不用了,谢谢! 所以我有一个看起来像这样的csv文件,我需要将本地csv文件导入到我的客户端javascript中: 我最终需要解析它并输出如下内容: 但就目前而言,我仍然只是将其导入javascript。 我当前的代码如下所示: 我已经研究并找到了一些关于的有用链接,但是我是javascript的新手,我并不完全了解它。我应该使用Ajax吗?F

  • 问题内容: 我有一个CSV文件,下面是其外观示例: 我知道如何读取文件并打印每列(例如- )。但是我真正想做的是读取行,就像这样,然后依此类推。 然后,我想将这些数字存储到变量中,以便稍后将它们总计(例如): 。那我可以做。 我将如何在Python 3中做到这一点? 问题答案: 您可以执行以下操作: 要么 : 编辑: