【问题标题】:Store different kind of types from a txt file to an array Java将不同类型的类型从 txt 文件存储到数组 Java
【发布时间】:2018-12-07 22:59:16
【问题描述】:

我有一个这样的txt文件

163 金钱掉落 24

454快乐112

45 没有你,一无所有 56

第一个数字是歌曲的id,我想将它存储为一个整数,第二个是一个字符串!那不是一个词!第三个是一个整数,是歌曲的点赞数。我想将它们存储在一个数组中,但是当我使用扫描仪方法时,我逐字存储它们,当一首歌的名称> 1 个单词时,我遇到了问题。这是我的测试代码

public void readFile() {
    while(x.hasNext()){
        Song test = new Song(Integer.parseInt(x.next()), x.next(), Integer.parseInt(x.next()));
    }
}

有什么方法可以读取 txt 文件,将第一个数字存储为 int,然后扫描整个字符串(歌曲名称)直到下一个元素是数字?

【问题讨论】:

  • 当数字是歌曲名称的一部分时会发生什么?
  • 在我的情况下没有这样的事情
  • 您可以读取 while 行,然后使用正则表达式对其进行解析,但如果您仍然可以更改文本文件的格式,最好使用专用的分隔符,例如 ',' 或';'在您的字段之间(即,将您的文本文件转换为 *.csv,这也便于在 excel 等电子表格程序中打开它)。
  • 你为什么不简单地阅读str中的行,解析为int substring(0, firstIndexOf whitespace),解析为int substring(lastIndexOf whitespace),然后使用substr(firstIndexOf, lastIndexOf)`作为标题?

标签: java arrays


【解决方案1】:

不使用正则表达式的最简单方法可能是使用扫描仪读取标题中的单个单词,然后将它们组合起来创建名称。像这样的:

int id = myScanner.nextInt();
String title = myScanner.next();

//while title has more words
while(!myScanner.hasNextInt()){
   //append words with whitespace
   title = title + " " + myScanner.next();
}

int likes = myScanner.nextInt();

【讨论】:

  • 我喜欢这个主意。一个建议是,最好使用 StringBuilder 来获得更好的性能,而不是串联。更多信息:Why StringBuilder when there is String?
  • 这是错误的,因为标题可能具有 int 值,例如 444 50 cent 323
  • @Spara 根据前两个 cmets:“(1)当数字是歌曲名称的一部分时会发生什么?->(2 - OP)在我的情况下没有这样的事情”。
  • 您可以扩展代码,以便在我们刚刚读取的数字之后还有另一个数字时,它甚至会附加数字
  • @user3699548 在这种情况下,您正在寻找hasNextInt()。
【解决方案2】:

因为没有分隔符,所以我假设第一个词是 id,最后一个词是点赞数,中间的其他词是名称。所以你可以使用这个方法:

String line = scanner.nextLine();
        String[] slices = line.split(" ");
        Song test = new Song(Integer.parseInt(slices[0]), line.substring(slices[0].length() + 1, line.lastIndexOf(" ")), slices[slices.length - 1]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    相关资源
    最近更新 更多