假设您必须编写一个方法,给定一个上述格式的文本文件,一个姓名和两个日期,返回两个日期之间归属于该人的总小时数,您的代码可以非常简单:
public int totalHours(Iterable<String> input, String person, String date1, String date2) {
SimpleDateFormat sdf = new SimpleDateFormat("MM.dd.yyyy");
Date start = sdf.parse(date1);
Date end = sdf.parse(date2);
int total = 0;
for (String line : input) { // assuming each string in input is a line
String parts[] = line.split(" ");
if ( ! parts[0].equals(person)) continue; // ignore - not him
Date d = sdf.parse(parts[1]);
if (d.compareTo(end) > 0) break; // if dates are sorted, we're finished
if (d.compareTo(start) <= 0) total += Integer.parseInt(parts[2]);
}
return total;
}
此代码假定您的输入已经分成几行。你写道你已经知道如何从文件中读取,所以这不应该是一个障碍。如果您将所有行存储在按日期索引的TreeMap 中,该函数将运行得更快(对于重复查询)。如果您从文件中构建HashMap<String, TreeMap<Date, Integer> >,效率会更高,其中字符串是人名,整数是这些日期的小时数。
编辑:文件读取部分的一种方式
有很多读取文件的方法。最标准的是您在评论中描述的那个。这是一个修改版本,对上述totalHours 进行了最小的更改(参数input 现在是Iterable<String> 而不是String[])。代码改编自
Iterating over the content of a text file line by line - is there a best practice? (vs. PMD's AssignmentInOperand):
public class IterableReader implements Iterable<String> {
private BufferedReader r;
public IterableReader(String fileName) throws IOException {
r = new BufferedReader(new FileReader(fileName));
}
public Iterator<String> iterator() {
return new Iterator<String>() {
String nextLine = readAndIfNullClose();
private String readAndIfNullClose() {
try {
String line = r.readLine();
if (line == null) r.close();
return line;
} catch (IOException e) {
return null;
}
}
@Override
public boolean hasNext() {
return nextLine != null;
}
@Override
public String next() {
String line = nextLine;
nextLine = readAndIfNullClose();
return line;
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
};
}
}
您现在应该可以按如下方式调用它:
System.out.println("Hours worked by Bob from 11.5.2015 to 15.5.2015: "
+ totalHours(new IterableReader("inputfile.txt"),
"Bob", "11.5.2015", "15.5.2015"));