Предполагая, что вам нужно написать метод, который, учитывая текстовый файл в вышеуказанном формате, имя и две даты, возвращает общее количество часов, приписанных к этому человеку между двумя датами, ваш код может быть очень простой:
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> >
из файла, где строки будут именами людей, а целые числа будут часами в эти даты.
Edit: один из способов сделать файл-чтение часть
Есть много способов чтения файлов. Наиболее стандартным является тот, который вы описываете в своем комментарии. Это модифицированная версия, которая делает минимальные изменения выше 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"));
Ой извините .. я забыл пометить код. Я сделал GUI и записал данные в текстовый файл через FileWriter. Я также могу читать текстовый файл. Но я не знаю, как с этим работать. – Kym
Этот вопрос принципиально не имеет смысла: как '11.5.2014 - 15.5.2014' относятся к' 42 часам'? Вы не указываете, как одна дата относится к другой, или даже формат, в котором она находится. Вы не понимаете, сравниваете ли вы какие-либо две строки в файле, или если строка * one * должна содержать две даты? Является ли формат файла выше для ввода, вывода или обоих? Вам нужны более продуманные примеры. Проверить http://www.sscce.org –
Будут ли даты всегда в порядке возрастания? Вы всегда возвращаете сумму всех часов для запрашиваемого лица между (или на) двумя датами ?. Это упрощает многое. – tucuxi