假设我们有两个带有逗号分隔值的日志文件。 file1.txt
代表employee id
和employee name
, file2.txt
代表employee id
和 projects
他与.
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);
我的问题是,
有什么方法可以优化它小于 O(n^2),而不使用任何额外的空间?
我使用了 3 个 BufferedReader 来读取
file2.txt
,一旦我们读到一行,它就会移动到下一行。还有其他选项可以标记当前行吗?如果我们将其视为一个表,查询上述场景的最佳方式是什么?
最佳答案
对于 1:是的。
对于 2:是:
我会分两次迭代完成:
迭代 ID (file1) 并初始化映射(empId、projectCounter)
迭代项目 (file2) 并为每一行更新 (projectCounter++) 映射中的相应条目。
这样,您将获得几乎线性的执行时间(对于文件 1 和文件 2 的大小)。
关于java - 解析两个文件并生成员工数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49357342/