【问题标题】:Searching in file - java在文件中搜索 - java
【发布时间】:2015-07-30 10:33:51
【问题描述】:

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

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

【问题讨论】:

  • 对不起.. 我忘了标记代码。我已经制作了 GUI 并通过 FileWriter 将数据写入文本文件。我也可以阅读文本文件。但我不知道如何使用它。
  • 这个问题根本没有意义:11.5.2014 - 15.5.201442 hours 有什么关系?您没有指定一个日期与另一个日期的关系,甚至没有指定它的格式。您不清楚您是在比较文件中的任何两行,还是 one 行必须有两个日期在里面?上面的文件格式是输入、输出还是两者兼而有之?您需要更多精心设计的示例。检查sscce.org
  • 日期是否总是按升序排列?您是否总是在两个日期之间(或在)返回被请求人员的所有小时总和?这大大简化了事情。

标签: java file search


【解决方案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&lt;String, TreeMap&lt;Date, Integer&gt; &gt;,效率会更高,其中字符串是人名,整数是这些日期的小时数。


编辑:文件读取部分的一种方式

有很多读取文件的方法。最标准的是您在评论中描述的那个。这是一个修改版本,对上述totalHours 进行了最小的更改(参数input 现在是Iterable&lt;String&gt; 而不是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")); 

【讨论】:

  • 吐槽西,非常感谢!你帮了我很多!谢谢!
  • 如果答案正确且有帮助,您应该投票和/或接受它
  • 当然。我也有几个问题..这是如何访问文件的正确方法吗?字符串文件名 = "databaze.txt";尝试{ FileReader filetoread = new FileReader(filename); BufferedReader bf = new BufferedReader(filetoread); }catch(IOException e){ System.out.println("error");您的方法使用数组作为文件输入。这意味着我应该从文件中创建数组? txt文件中一行的一个数组索引?编辑:如何在这里格式化代码?我找到了指南,但每个指南都告诉我点击下面的 {} 符号...但我什么都看不到...抱歉...
  • 查看编辑后的版本。如果看起来太复杂,请传递 Files.readAllLines(FileSystems.getDefault().getPath(fileName), Charset.defaultCharset()); 的结果而不是 new IterableReader(fileName)
  • 感谢您为我做这件事 :) !它还在“Date d = sdf.parse(line[1]);”行上抛出错误错误 - 需要数组,但找到了字符串..我在将这个添加到我的代码时遇到了一些问题..我上次使用 java 已经很久了......抱歉打扰你了..
【解决方案2】:
 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 个索引的数组“部分” 每行,所以你应该转换为 int 或 String 取决于你 想要做。 0 = 名称 1 = 小时 2 = 这个永远孤独的数字:D

【讨论】:

    猜你喜欢
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多