仅将特定文本从文件添加到数组列表,第2部分 – Java

我希望我能有一些很好的建议,我可以在这里解决这个问题:

我有这个带有地点和名字的文本文件 – 名称详细信息表示该人访问过的地点:

Place: New York Place: London Place: Paris Place: Hongkong 1. Name: John 1. Name detail: London 1. Name detail: Paris 1. Name detail: Hongkong 2. Name: Sarah 2. Name detail: London 3. Name: David 3. Name detail: New York 3. Name detail: Paris 

这是我的代码的一部分。

 private ArrayList places = new ArrayList(); private ArrayList names = new ArrayList(); public void load(String fileName) throws FileNotFoundException { ArrayList place = places; BufferedReader br = new BufferedReader(new FileReader(fileName)); int nameCounter = 1; int nameDetailCounter = 1; String text; try { while ((text = br.readLine()) != null) { if (text.contains("Place:")) { text = text.replaceAll("Place:", ""); places.add(new Place(text)); } else if (text.contains(nameCounter + ". Name:")) { text = text.replaceAll(nameCounter + ". Name:", ""); names.add(new Name(text, "")); nameCounter ++; } //starting from here! else if (text.contains(nameDetailCounter + ". Name detail:")) { text = text.replaceAll(nameDetailCounter + ". Name detail:", ""); for (Name name : names) { Name nameDetails = findName(name.getName()); Place placeDetails = findPlace(text); nameDetails.addName(placeDetails); } nameDetailCounter ++; } } } catch (Exception e) { System.err.println("Error: " + e.getMessage()); } } 

我的想法是选择所有“1”。 首先从文本文件中将其添加到数组中,继续所有“2”。 并将其添加到数组中,依此类推。

我尝试了很多方法,但它没有在“1”的开头添加所有Name详细信息。 在数组中。 感谢任何新的想法或建议,谢谢!

使用正则表达式提取行上的数字而不是尝试跟踪/猜测它可能会更好(见下文)。

这是一个经过测试的代码重新创建,因为你引用了一些你没有提供的类……但是这应该有助于:

 public static String getMatch(final String pattern, final String content) { Pattern r = Pattern.compile(pattern); Matcher m = r.matcher(content); if (m.find()) { return m.group(1); } else { return ""; } } public static void load(String fileName) throws FileNotFoundException { List places = new ArrayList(); List names = new ArrayList(); List nameDetails = new ArrayList(); BufferedReader br = new BufferedReader(new FileReader(fileName)); String text; String lastName = ""; try { while ((text = br.readLine()) != null) { // extract num from start of line or empty if none.. String num = getMatch("^([0-9]+)\\.", text); if (text.contains("Place:")) { text = text.replaceAll("Place:", ""); places.add(text); } else if (text.contains(num + ". Name:")) { text = text.replaceAll(num + ". Name:", ""); names.add(text); lastName = text; } else if (text.contains(num + ". Name detail:")) { text = text.replaceAll(num + ". Name detail:", ""); nameDetails.add(lastName + " had " + text); } } } catch (Exception e) { System.err.println("Error: " + e.getMessage()); } System.out.println("Places:" + places); System.out.println("Names:" + names); System.out.println("Name Details:" + nameDetails); } 

具有String nameList places的Traveler类如何,而不是具有Name类? 然后,您可以在Traveler类上add(Place p)方法add(Place p)