我将以如下格式将数据写入文本文件:
Jonathan 09.5.2015 1
John 10.5.2015 4
Jonathan 11.5.2015 14
Jonathan 12.5.2015 15
Jonathan 13.5.2015 7
Tobias 14.5.2015 9
Jonathan 15.5.2015 6
最后一个数字是小时。我需要做一些可以写两个日期和名字的东西。例如-Jonathan 11.5.2015
和第二个日期15.5.2015
。我只想在两次约会之间数几个小时。输出应该看起来像Jonathan 11.5.2014 - 15.5.2014 - 42 hours
。我对GUI没有问题,但我不知道如何正确计算结果。
假设您必须编写一个方法,在给定上述格式的文本文件、一个名称和两个日期的情况下,返回该人在这两个日期之间的总小时数,则您的代码可以变得非常简单:
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[]
(。代码改编自逐行遍历文本文件的内容——有最佳实践吗?(与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"));
import java.io.*;
class Test{
BufferedReader f = null;
try{
f = new BufferedReader(new FileReader("youFile.txt"));
String something=null;
while((something=f.readLine())!=null){
String[] part= something.split(" ");
}
}catch(FileNotFoundException e){
e.getMessage();
}
}
分割此代码后,您将得到一个具有3索引的数组"part"每行,所以应该转换为int或String,具体取决于想要做。0=名称1=小时2=这个永远孤独的数字:D