我有一个以冒号分隔的文本文件,其中包含结构化的分组数据。 People
组包含人名,后跟年龄,以冒号分隔。我如何解析文本并根据他们的年龄对人进行分组?
结构如下:
Group.txt
Age:10:20:30:40:
Group:G1:10:G2:30:G3:20:G4:40:
People:Jack:10:Tom:30:Dick:20:Harry:10:Paul:10:Peter:20:
People:Mary:20:Lance:10:
我想展示这样的东西:
G1 Jack Harry Paul Lance
G2 Dick Peter Marry
G3 Tom
G4
答案 0 :(得分:2)
我建议先创建一个具有相应年龄的所有群组中的Map
。
为此,您可以使用左侧Regex
字符串alphanumeric
和digit
右侧colon
来查找{ {1}}。
我怀疑这些行来自你的档案。因此,首先您需要检查您的行是否以Group
开头。然后在该行应用以下正则表达式: -
Group
然后将所有匹配字符串的"([A-Za-z0-9]+):(\\d+)" // Matches `G1:10`, `G2:30`, ...
和group 1
添加到group 2
现在,对于以Map<String, Integer>
开头的其他行,请应用类似的正则表达式,但People
左侧只有alphabetic characters
,然后获取colon
已创建的group
。
Map
可能会让你开始。
更新:
根据您的最新编辑,我建议创建一个包含3个属性的"([A-Za-z]+):(\\d+)" // Matches `John:22`
类:
Group
而不是创建class Group {
private String groupName;
private int age;
private List<String> people;
}
,而是创建Map<String, Integer>
。你的工作会更容易。 Map<Integer, Group>
为Integer
。
因此,当您获得具有特定age
的{{1}}时,请从Person
的{{1}}获取组对象,并更新age
那个人Map
。
请尝试一下,看看你是否可以解决它。
答案 1 :(得分:0)
您可以使用StringTokenizer拆分行,然后创建一个&#34; People&#34;实现Comparable Interface的类。
这些应该至少让你开始。
答案 2 :(得分:0)
你可以split字符串:
String[] items = row.split(":");
if (items[0].equals("Age")) {
// items[1] and onwards consists of Ages
}
if (items[0].equals("Group")) {
// items[1] and onwards consists of group name/numbers
}
等等
答案 3 :(得分:0)
制作一个包含个人信息的新课程。 (这个可以工作,但是为了保持简短,打破了一堆好的做法。阅读POJO,了解如何将属性设为私有的更多细节,如果你愿意,可以添加访问者方法。这是一个不同的讨论。
public class Person { public String name; public int age; }
然后,您可以使用此新类将人员信息存储到您稍后可以访问的列表中。
当您遍历文件时,当您找到以People:
开头的行时,您可以使用以下代码对其进行解析:
List<Person> people = new ArrayList<Person>();
String str = "People:Mary:20:Lance:10:"; // Replace with the line you read from the file
Pattern p = Pattern.compile("(?:([^:]*):(\\d*):)");
Matcher m = p.matcher(str);
while(m.find()) {
for(int i=1; i<=m.groupCount(); i+=2) {
Person p = new Person();
p.name = m.group(i);
p.age = new Integer(m.group(i+1));
people.add(p);
}
}
// At this point, all your people are store into the list.
答案 4 :(得分:0)
我会将这项任务分解成碎片。首先,找到所有组:
/^Group:(G[0-9]+:[0-9]+)*/
从该行获取第一个捕获组,在:
上拆分每个匹配,然后您将每个组的名称映射到相应的年龄。
接下来,与人类似的事情:
/^People:([A-Za-z]+:[0-9]+)*/
按照之前的方式进行匹配,分组和分割,现在您可以将每个人映射到他或她的年龄。从那里,您所要做的就是为每个年龄段制作一个桶,按年龄对桶进行分类,并将每个人放在适当的桶中。