java - 解析两个文件并生成员工数据

标签 java sql file bufferedreader filereader

假设我们有两个带有逗号分隔值的日志文件。 file1.txt代表employee idemployee name , file2.txt代表employee idprojects他与. file1具有独特的条目。 file2会有多对多的关系。新员工file2.txt中没有任何条目如果他没有分配任何项目。

File1.txt:(EmpId, EmpName)
1,abc
2,ac
3,bc
4,acc
5,abb
6,bbc
7,aac
8,aba
9,aaa

File2.txt: (EmpId, ProjectId)
1,102
2,102
1,103
3,101
5,102
1,103
2,105
2,200
9,102

Find the each employee has been assigned to number of projects. For New employees if they dont have any projects print 0;
Output:
1=3
2=3
3=1
4=0
5=1
6=0
7=0
8=0
9=1

我使用 BufferedReader 从 file1 读取一行并将其与 file2 中的每一行进行比较。下面是我的代码,

public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        BufferedReader file1 = new BufferedReader(new FileReader("file1.txt"));
        BufferedReader file2 = new BufferedReader(new FileReader("file2.txt"));
        BufferedReader file3 = new BufferedReader(new FileReader("file2.txt"));
        HashMap<String,Integer> empProjCount = new HashMap<String, Integer>();
        int lines =0;
        while (file2.readLine() != null) 
            lines++;
        String line1 = file1.readLine();
        String[] line_1 = line1.split(",");
        String line2 = file3.readLine();
        String[] line_2 = line2.split(",");
        while(line1 != null && line2 != null)
        {
            int count = 0;
            for(int i=1;i<=lines+1 && line2 != null;i++)
            {
            if(line_1[0].equals(line_2[0]))
            {
                count++;
            }
            line2 = file3.readLine();
            if(line2 != null){
                line_2 = line2.split(",");
            }
            }
            file3 = new BufferedReader(new FileReader("file2.txt"));
            empProjCount.put(line_1[0], count);
            line1 = file1.readLine();
            if(line1 != null) line_1 = line1.split(",");
            line2 = file3.readLine();
            if(line2 != null) line_2 = line2.split(",");
        }
        System.out.println(empProjCount); 

我的问题是,

  1. 有什么方法可以优化它小于 O(n^2),而不使用任何额外的空间?

  2. 我使用了 3 个 BufferedReader 来读取 file2.txt ,一旦我们读到一行,它就会移动到下一行。还有其他选项可以标记当前行吗?

  3. 如果我们将其视为一个表,查询上述场景的最佳方式是什么?

最佳答案

对于 1:是的。

对于 2:是:

我会分两次迭代完成:

  1. 迭代 ID (file1) 并初始化映射(empId、projectCounter)

  2. 迭代项目 (file2) 并为每一行更新 (projectCounter++) 映射中的相应条目。

这样,您将获得几乎线性的执行时间(对于文件 1 和文件 2 的大小)。

关于java - 解析两个文件并生成员工数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49357342/

相关文章:

java - Java中字节到整数再到字符串的转换

mysql - 选择范围 [0,44) 不在列中的最小值

mysql - SQL - 无法使用多个聚合函数结果过滤表

java - 获取java中某个单词后面的单词

c++ - 在不存在的目录中打开文件 c 与 c++

java - Eclipse RCP - SelectionService - 历史?

java - 使用 JavaMail 解析 MIME 消息

java - 如何为kafka客户端配置代理?

sql - 什么时候索引在小引用表上是合理的?

java - StringTokenizer 使用