【发布时间】:2022-01-26 00:49:54
【问题描述】:
对于我的一项学校作业,我必须使用 Java 解析 GenBank files。我必须存储和检索文件的内容以及提取的信息,以保持尽可能小的时间复杂度。使用 HashMaps 或将数据存储为记录之间有区别吗?我知道使用 HashMaps 会是 O(1),但是使用记录的可读性和不变性让我更喜欢使用它们。对象将存储在一个数组中。
这是我现在的方法
public static GenBankRecord parseGenBankFile(File gbFile) throws IOException {
try (var fileReader = new FileReader(gbFile); var reader = new BufferedReader(fileReader)) {
String organism = null;
List<String> contentList = new ArrayList<>();
while (true) {
String line = reader.readLine();
if (line == null) break; //Breaking out if file end has been reached
contentList.add(line);
if (line.startsWith(" ORGANISM ")) {
// Organism type found
organism = line.substring(12); // Selecting the correct part of the line
}
}
// Loop ended
var content = String.join("\n", contentList);
return new GenBankRecord(gbFile.getName(),organism, content);
}
}
GenBankRecord 如下:
record GenBankRecord(String fileName,String organism, String content) {
@Override
public String toString(){
return organism;
}
}
假设键值对与记录的字段相同,使用记录和HashMap有区别吗?
String current_organism = gbRecordInstance.organism();
和
String current_organism = gbHashMap.get("organism");
【问题讨论】:
-
“将数据存储为记录实例”是什么意思。 HashMap 是一种数据结构,“记录实例”可能意味着很多东西……它们不能直接比较。
-
“时间复杂度”是什么意思?你真的是这个意思,还是你指的是挂钟时间意义上的时间?我看到您的一个记录对象的名称中有“db”。你有记录的代码吗?您是在谈论哈希映射和文件访问之间的实际访问时间差吗?
-
Records 和
HashMap是苹果和橘子——比较它们没有任何意义。 -
实际上,不,它没有澄清。严重地。首先以最自然的方式编写代码(您的 意见)。稍后考虑效率问题。你正在做的是过早的优化。这是个坏主意。 >您的
-
旁注:您可以简单地使用
try (var reader = Files.newBufferedReader(gbFile.toPath())) {而不是try (var fileReader = new FileReader(gbFile); var reader = new BufferedReader(fileReader)) {但是由于您将所有行都读入列表中,因此您可以只使用List<String> contentList = Files.readAllLines(gbFile.toPath());。然后,您必须在该列表中搜索" ORGANISM "行,但其他所有内容都已过时。
标签: java hashmap time-complexity record