在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。我对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

相关内容

  • 没有找到相关文章

最新更新