所以我有一个动物园数据库,游客可以看到不同种类的动物。每个访客都有自己的日志,记录他看到的动物和时间。我试图创建一个访客看到的所有动物的列表,并将访客的独特身份分开。如果访客在不同的日子看到同一种动物,则将动物被看到的次数映射到动物名称。我只需要列表中的动物名称和客户端的id用于其他处理目的。日期并不重要。这就是示例日志的样子。
ClientId: 1001
Zebra 10/1
Cheetah 10/2
Tiger 10/2
Lion 10/3
Zebra 10/4
这是我的日志类:
public class Log {
private int clientId;
private int animalCount = 1;
private Map<String, Integer> animalList = new HashMap<String, Integer>();
public void addFromFile(String fileName) {
File file = new File(fileName);
Scanner sc = null;
try {
sc = new Scanner(file);
} catch (FileNotFoundException e) {
System.out.println("File Not Found.");
}
while (sc.hasNextLine()) {
sc = new Scanner(sc.nextLine());
String s = sc.next();
//Don't add the dates. Only the Strings
if (!isNumeric(s)) {
if (animalList.containsKey(s)) {
animalList.put(s, animalList.get(s) + 1);
} else {
animalList.put(s, animalCount);
}
}
}
}
public Map<String, Integer> getList() {
return animalList;
}
public int getClientId() {
return this.clientId;
}
public int itemCount() {
return this.itemCount;
}
public boolean isNumeric(String str) {
return Character.isDigit(str.charAt(0));
}
}
日志将始终按该顺序显示。我首先处理客户端ID行然后进行动物名称处理时遇到问题。
使用上面的示例日志的以下输出是:
Log log = new Log();
log.addFromFile("DataSetOne1.txt");
System.out.println(log.getList());
//Output: {ClientId:=1}
我的代码一直停留在第一行。我希望能够处理第一行并首先将其排除,因为它包含我唯一关注的整数值。我只是对如何解决这个问题感到困惑。
答案 0 :(得分:1)
如果每个条目都在一个单独的行上,则遍历字符,直到找到digits
(数字)或:
个字符,每行,将字符存储在2D数组中,或者列表中的数组。
如果在一行上找到的字符是:
,则丢弃之前获取的该行的字符,并记录字符直到该行的结尾,这个String.trim()
应该得到你您访问者的ID。
否则,如果找到一个数字,则停止记录字符,然后突破该行的循环,再次,在.trim()
后,您应该拥有该动物的名称。 / p>
PS:RegEx或模式匹配器更难理解(正如您在OP的评论中指出的那样),但会使这更容易。如果你想使用字符串或文件解析,你应该真的,真的,真的, 真的 学习这些东西
答案 1 :(得分:0)
结束搞清楚事情。它不是最优雅的解决方案,但它可以解决问题。
public void addFromFile(String fileName) {
File file = new File(fileName);
Scanner sc = null;
try {
sc = new Scanner(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
while (sc.hasNextLine()) {
Scanner sc2 = new Scanner(sc.nextLine());
while (sc2.hasNext()) {
String s = sc2.next();
if (!isNumeric(s)) {
// Retrieve the client ID and assign it to the instance
// variable
if (s.equals("ClientId:")) {
clientId = Integer.parseInt(sc2.next());
}
if (animalList.containsKey(s)) {
animalList.put(s, animalList.get(s) + 1);
} else {
animalList.put(s, animalCount);
}
}
}
}
// Delete the ClientId entry
animalList.remove("ClientId:");
}