我需要实现方法
void filter(Reader mails, Reader groups, Writer users) throws IOException
以这种方式将读者的两个数据组合成一个作家。
mails
的文件如下所示:
Login;Email
login1;mail1@mail.com
login2;mail2@mail.com
login3;mail3@mail.com
login4;mail4@mail.com
,groups
的文件如下所示:
Login;Group;
login1;Group1
login2;Group2
login3;Group3
login4;Group2
合并的结果应如下所示:
Login;Email;Group
login1;mail1@mail.com;Group1
login2;mail2@mail.com;Group2
login3;mail3@mail.com;Group3
login4;mail4@mail.com;Group2
所以,我提出的是:从第一个读取器获取一个字符串,然后从第二个读取器获取另一个字符串,根据需要操作它们,然后用writer编写结果。
但有没有办法让它变得不同或更优雅?
PS:我不得不只使用Reader
和Writer
类。
顺便说一句:当我用Writer写一些文件时,如果我查看文件,我会看到一些不可读的东西。但是,如果我用Reader读取相同的文件然后在控制台上打印它,它看起来没问题。这是正常的吗?或者我如何写入文件以使其可读?
答案 0 :(得分:2)
如何使用Map和POJO容器。
Pojo是
String email;
String group;
然后你有一个hashmap
Map<String,EmailGroup> emailGroup = new HashMap<String,EmailGroup>();
然后您的阅读代码将读取电子邮件列表,然后填充该组。
readEmail(emailGroup);
readGroup(emailGroup);
readEmail(Map<String,EmailGroup> map)
{
EmailGroup tempgroup;
if(map.contains(login))
{
tempGroup = map.get();
}
else
{
EmailGroup tempGroup = new EmailGroup();
}
tempGroup.setEmail(readEmailAddress);
map.put(login,tempGroup);
}
readGroup执行相同操作但调用setGroup();
这不是一个完整的解决方案,但应提供另一种解决此问题的可行方法的建议。
答案 1 :(得分:1)
如果要使用此签名实现方法,可以执行以下操作:
public static void main(String[] args) throws Exception {
String mails = "Login;Email\n"
+ "login1;mail1@mail.com\n"
+ "login2;mail2@mail.com\n"
+ "login3;mail3@mail.com\n"
+ "login4;mail4@mail.com";
String groups = "Login;Group;\n"
+ "login1;Group1\n"
+ "login2;Group2\n"
+ "login3;Group3\n"
+ "login4;Group2";
Reader mailsReader = new StringReader(mails);
Reader groupsReader = new StringReader(groups);
Writer mergedWriter = new StringWriter();
filter(mailsReader, groupsReader, mergedWriter);
System.out.println(mergedWriter.toString());
}
static void filter(Reader mails, Reader groups, Writer users) throws IOException {
BufferedReader mbr = new BufferedReader(mails);
BufferedReader gbr = new BufferedReader(groups);
BufferedWriter ubw = new BufferedWriter(users);
String ml = mbr.readLine();
String gl = gbr.readLine();
while (ml != null && gl != null) {
ubw.write(ml + ";" + gl.split(";")[1] + "\n");
ml = mbr.readLine();
gl = gbr.readLine();
}
ubw.flush();
}
输出:
Login;Email;Group
login1;mail1@mail.com;Group1
login2;mail2@mail.com;Group2
login3;mail3@mail.com;Group3
login4;mail4@mail.com;Group2
答案 2 :(得分:0)
在公共密钥Login
上看起来像join。
这应该很容易通过一些地图和一些POJO来解决。
以下一些有助于澄清我的想法的其他信息。
让我们考虑以下数据表。它包含人的姓名,电子邮件地址和登录信息。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ Login + Email + First name + Last name +
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ smith + smith@mail.com + John + Smith +
+ miller + miller@mail.com + John + Miller +
+ jackson + mail@jackson.com + Scott + Jackson +
+ scott + me@scott.com + Scott + Jackson +
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
此信息足以进行简单的数据查询。如果我们想知道John Smith的电子邮件地址是什么,我们必须在第一个表中执行搜索。如果我们想知道Scott Jackson的地址,我们就会遇到问题,因为我们的数据库中有两个人姓名相同。
因此,有必要区分人员,即Login
列。它在此表中是唯一的,因此可用于避免含糊不清。
由于Login
具有此属性,因此称为键。
下一张表格包含每次登录的群组关联。
++++++++++++++++++++++++++++++++++++++++
+ Login + Group +
++++++++++++++++++++++++++++++++++++++++
+ smith + user +
+ miller + user +
+ jackson + admin +
+ scott + admin +
++++++++++++++++++++++++++++++++++++++++
上表也以Login
为关键。使用该属性允许我们进行另一种类型的查询。可以询问人员的团体联系,为此,我们必须检索有问题的用户的登录。因此使用第一个表。由于Login
是第二个表中的键,因此可用于获取组附属关系。
此过程称为加入,我们将第二个表中的组从属关系与第一个表中的第一个和第二个名称相关联,并将登录信息用作键强>
自然连接对所有行执行此操作。在这一点上,我希望很清楚为什么,我提出了一个加入。 2个文件对应于2个表(对于数据顺序的变化不变)。加入它们会产生包含所有信息的第三个表。打印该表是OP问题的答案。
为了利用基础关系代数的强大功能,可以使用以java.util.Map
为关键字的简单Login
。