2012-11-13 88 views
0

我有一個冒號分隔的文本文件,其中包含結構化的分組數據。 People組包含人員姓名及其年齡,並用冒號分隔。我如何根據他們的年齡解析文本和羣組?Java分隔符閱讀器

的結構如下:

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

你到目前爲止嘗試過什麼?如果你完全不知道從哪裏開始,我建議看看javadocs中的String類。 (http://docs.oracle.com/javase/7/docs/api/java/lang/String.html) – posdef

+0

我試過使用arraylist。和line.split(「:」); 但使用這種方法,我不得不像行(0),行(1),行(2)等這是不好的,因爲有什麼100行內輸入? – newbieprogrammer

+0

你能顯示你的代碼嗎? –

回答

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 
} 

2

我建議首先創建所有與各年齡組的Map

對於您可以在colon的與Group啓動權,對線使用Regex,將左邊取alphanumeric字符串,digit

我懷疑那些行來自您的文件。所以,首先你需要檢查你的線是否以Group開頭。然後在該行申請以下的正則表達式: -

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

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

現在,開始People進一步線,應用類似的正則表達式,但在colon的左側只有alphabetic characters,然後從已創建的Map中獲得特定年齡的group

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

可能是這會讓你開始。


UPDATE:

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

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

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

因此,當你得到一個Person與特定age,取從Map組對象爲age,並更新group object與人的List<String>

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

+0

這種方法是否需要硬編碼?因爲人名可能不同group.txt – newbieprogrammer

+0

不,這不需要硬編碼。你可以創建一個'Map'並使用任何其他文件,並獲取'People'。併爲他們從地圖上獲得相應的組。 –

+0

@newbieprogrammer ..看看我最新的編輯。 –

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. 
+0

你不需要那個循環。你的外部循環就足夠了。它會給你所有與他們同齡的人。只需在while循環中打印'm.group(1)'和'm.group(2)'。 –

+0

是的,我猜。我只是試圖使它具有通用性,以防將更多組添加到正則表達式中。 – mprivat

+0

@mpvrivat如何在while循環之外使用變量「age」? – newbieprogrammer

0

我會把這個任務分解成幾部分。首先,找到所有的羣體:

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

在第一個捕獲組從該行上:拆分每場比賽,你就會有映射到相應的年齡各組的名稱。

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

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

比賽,組,並拆分爲你做之前,現在你有每個人映射到他或她的年齡。從那裏開始,你所要做的就是爲每個年齡組製作一個桶,按年齡對桶進行分類,並將每個人放入適當的桶中。

+0

團隊和人員如何連接在一起進行排序? – newbieprogrammer