0

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

5 回答 5

2

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

为此,您可以使用 aRegex来获取alphanumeric左侧和digit右侧的字符串,以获取以 .colon开头的行Group

我怀疑这些行来自您的文件。所以,首先你需要检查你的行是否以Group. 然后在该行上应用以下正则表达式: -

"([A-Za-z0-9]+):(\\d+)"  // Matches `G1:10`, `G2:30`, ...

然后将所有匹配字符串的group 1和添加到group 2Map<String, Integer>

现在,对于以 开头的其他行People,应用类似的正则表达式,但仅alphabetic characters在 的左侧colon,然后group从已创建的特定年龄中获取Map

"([A-Za-z]+):(\\d+)"  // Matches `John:22`

可能这会让你开始。


更新 :

根据您的最新编辑,我建议创建一个Group具有 3 个属性的类:

class Group {
    private String groupName;
    private int age;
    private List<String> people;
}

而不是创建一个Map<String, Integer>,创建一个Map<Integer, Group>。你的工作会更轻松。Integerage

所以,当你得到一个Person特定的 时,从那个获取age组对象,并用那个人更新那个。MapageList<String>group object

请尝试一下,看看您是否可以解决它。

于 2012-11-13T15:49:30.727 回答
0

我会把这个任务分解成碎片。首先,找到所有组:

/^Group:(G[0-9]+:[0-9]+)*/

从该行获取第一个捕获组,在 上拆分每个匹配:项,您将每个组的名称映射到相应的年龄。

接下来,与人类似的事情:

/^People:([A-Za-z]+:[0-9]+)*/

像以前一样匹配、分组和拆分,现在您将每个人映射到他或她的年龄。从那里,您所要做的就是为每个年龄组制作一个桶,按年龄对桶进行排序,然后将每个人放在适当的桶中。

于 2012-11-13T23:10:48.853 回答
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.
于 2012-11-13T16:13:04.040 回答
0

您可以使用StringTokenizer拆分您的线路,然后创建一个实现Comparable Interface的“People”类。

这些至少应该让你开始。

于 2012-11-13T15:43:51.397 回答
0

您可以拆分字符串:

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
}

等等

于 2012-11-13T15:44:27.697 回答