2015-05-18 2 views
-3

Я буду писать данные в текстовый файл в формате, как это:Поиск в файле - Java

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 У меня нет проблем с графическим интерфейсом, но я не знаю, как правильно вычислить результат.

+0

Ой извините .. я забыл пометить код. Я сделал GUI и записал данные в текстовый файл через FileWriter. Я также могу читать текстовый файл. Но я не знаю, как с этим работать. – Kym

+0

Этот вопрос принципиально не имеет смысла: как '11.5.2014 - 15.5.2014' относятся к' 42 часам'? Вы не указываете, как одна дата относится к другой, или даже формат, в котором она находится. Вы не понимаете, сравниваете ли вы какие-либо две строки в файле, или если строка * one * должна содержать две даты? Является ли формат файла выше для ввода, вывода или обоих? Вам нужны более продуманные примеры. Проверить http://www.sscce.org –

+0

Будут ли даты всегда в порядке возрастания? Вы всегда возвращаете сумму всех часов для запрашиваемого лица между (или на) двумя датами ?. Это упрощает многое. – tucuxi

ответ

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(); 
     } 
    } 

После разделить этот код, вы получите массив «часть» с 3 индекса в каждой строке, так что вы должны преобразовать в целое или строки в зависимости от того, что вы хотите сделать. 0 = имя 1 = час 2 = это только навсегда номер: D

1

Предполагая, что вам нужно написать метод, который, учитывая текстовый файл в вышеуказанном формате, имя и две даты, возвращает общее количество часов, приписанных к этому человеку между двумя датами, ваш код может быть очень простой:

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")); 
+0

tucuxi, спасибо очень много! Вы мне очень помогли ! Благодаря! – Kym

+0

Если ответ верный и полезный, вы должны перенестись и/или принять его. – tucuxi

+0

Ofcourse. Также у меня есть несколько вопросов. Правильно ли это, как получить доступ к файлу? String filename = "databaze..txt "; попытка { FileReader filetoread = новый FileReader (имя файла); BufferedReader бф = новый BufferedReader (filetoread); } поймать (IOException е) { System.out.println (" ошибка ");} Ваш метод использует arrray в качестве входного файла .. это означает, что я должен сделать массив из файла? Один индекс массива для одной строки в txt-файле? edit: как отформатировать код здесь? Я нашел руководства, но каждый гид сказал мне нажать {} символ ниже ... но я не вижу ничего ... Извините ... – Kym

Смежные вопросы