簡體   English   中英

Java分隔符閱讀器

[英]Java delimiter reader

我有一個冒號分隔的文本文件,其中包含結構化的分組數據。 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

我建議首先創建一個具有相應年齡的所有組的Map

為此,您可以使用一個Regex ,它可以獲取左側的alphanumeric字符串,以及colon右側的digit ,用於以Group開頭的行。

我懷疑這些行來自你的文件。 因此,首先您需要檢查您的行是否以Group開頭。 然后在該行應用以下正則表達式: -

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

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

現在,對於以People開頭的其他行,應用類似的正則表達式,但只使用colon左側的alphabetic characters ,然后從已創建的Map獲取特定年齡的group

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

可能這會讓你開始。


更新:

根據您的最新編輯,我建議創建一個包含3個屬性的Group類:

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

而不是創建Map<String, Integer> ,而是創建Map<Integer, Group> 你的工作會更容易。 Integerage

因此,當您獲得具有特定agePerson age ,從該ageMap獲取組對象,並使用該人更新該group objectList<String>

請試一試,看看你是否可以解決它。

您可以使用StringTokenizer拆分行,然后創建一個實現Comparable Interface的“People”類。

這些應該至少讓你開始。

你可以拆分字符串:

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
}

等等

創建一個包含人員信息的新課程。 (這個可以工作,但為了保持簡短,打破了一堆好的做法。閱讀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.

我會將這項任務分解成碎片。 首先,找到所有組:

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

從該行獲取第一個捕獲組,將每個匹配分開: ,然后您將每個組的名稱映射到相應的年齡。

接下來,與人類似的東西:

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

像以前一樣進行匹配,分組和分割,現在您將每個人映射到他或她的年齡。 從那里,您所要做的就是為每個年齡段制作一個桶,按年齡對桶進行排序,並將每個人放在適當的桶中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM