在文件中搜索 - java

时间:2015-05-18 19:28:59

标签: java file search

我会将数据写入文本文件,格式如下:

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问题,但我不知道如何计算结果的正确方法。

2 个答案:

答案 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