我希望我能提出一些很好的建议,以解决这个问题:
我有一个带有位置和名称的文本文件-名称详细信息指示此人访问过的位置:
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<Place> places = new ArrayList<>(); private ArrayList<Name> names = new ArrayList<>(); public void load(String fileName) throws FileNotFoundException { ArrayList<Place> 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”开头添加所有“名称”详细信息。在数组中。感谢您提出的任何新想法或建议,谢谢!
最好使用正则表达式提取行上的数字,而不要尝试跟踪/猜测它(请参见下文)。
这是对代码的一种经过测试的重新创建,因为您引用了一些您未提供的类…但这有望对您有所帮助:
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<String> places = new ArrayList<String>(); List<String> names = new ArrayList<String>(); List<String> nameDetails = new ArrayList<String>(); 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); }