我会将数据写入文本文件,格式如下:
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问题,但我不知道如何计算结果的正确方法。
答案 0 :(得分:1)
假设您必须编写一个方法,在给定上述格式的文本文件的情况下,使用名称和两个日期,返回两个日期之间归属于该人的总小时数,您的代码可以非常简单: / p>
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"));
答案 1 :(得分:0)
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();
}
}
拆分此代码后,您将得到一个数组&#34; part&#34;有3个指数 每行,所以你应该转换为int或String取决于你 想做。 0 =名称1 =小时2 =这个永远孤独的数字:D