Java分隔符阅读器

时间:2012-11-13 15:36:53

标签: java delimiter

我有一个以冒号分隔的文本文件,其中包含结构化的分组数据。 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

5 个答案:

答案 0 :(得分:2)

我建议先创建一个具有相应年龄的所有群组中的Map

为此,您可以使用左侧Regex字符串alphanumericdigit右侧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]+)*/

按照之前的方式进行匹配,分组和分割,现在您可以将每个人映射到他或她的年龄。从那里,您所要做的就是为每个年龄段制作一个桶,按年龄对桶进行分类,并将每个人放在适当的桶中。