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最初に、それぞれの年齢ですべてのグループを作成することをお勧めします。

そのために、 で始まる行に対して、 の左側と右側で文字列をRegex取得する を使用できます。alphanumericdigitcolonGroup

これらの行はあなたのファイルからのものであると思われます。したがって、まず、行が で始まるかどうかを確認する必要がありますGroup。次に、その行に次の正規表現を適用します。

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

そして、一致したすべての文字列のgroup 1andをgroup 2Map<String, Integer>

ここで、 で始まる次の行について、同様の Regex を適用しますが、 の左側Peopleだけに適用し、作成済みの から特定の年齢の を取得します。alphabetic characterscolongroupMap

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

これで始められるかもしれません。


アップデート :

最新の編集に基づいて、Group3 つの属性を持つクラスを作成することをお勧めします。

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

を作成する代わりに、 をMap<String, Integer>作成しますMap<Integer, Group>。あなたの仕事はより簡単になります。Integerですage

Personしたがって、特定の で を取得したら、そのageの からグループ オブジェクトを取得し、その のをその人物で更新します。MapageList<String>group object

回避できるかどうか試してみてください。

于 2012-11-13T15:49:30.727 に答える
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 に答える
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 に答える