我试图解决这个问题:https://kth.kattis.com/problems/genealogical并且那里唯一的测试用例非常完美。但纠正它的机器人说ArrayIndexOutOfBounds但不是我在哪里查看过但无法找到它。我添加了一些东西,比如第19行的if语句。这是我的代码:
public class Person {
private String name;
private String date;
private List<Person> children = new ArrayList<Person>();
private Person mom;
public boolean used = false;
private String deathDate = null;
private List<Person> ancestors = new ArrayList<Person>();
private List<Person> descendants = new ArrayList<Person>();
public Person getMom() {
return mom;
}
private Person dad;
public Person getDad() {
return dad;
}
public List<Person> getDescendants() {
return descendants;
}
public List<Person> getAncestors() {
return ancestors;
}
public Person(Person mom, Person dad)
{
this.mom = mom;
this.dad = dad;
}
public Person(String peo)
{
name = peo;
}
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return this.name;
}
public void setDate(String date)
{
this.date = date;
}
public String getDate()
{
return this.date;
}
public void addChild(Person child)
{
children.add(child);
}
public void kill(String date)
{
this.deathDate = date;
}
public void addAncestors(Person p)
{
ancestors.add(p);
}
public void addDescendants(Person p)
{
descendants.add(p);
}
public String getDeathdate()
{
if(this.deathDate == null)
return "";
else
return " " + this.deathDate;
}
}
这是我的班级: import java.util.ArrayList; import java.util.List;
"pip install deap"
任何人都有任何可能出错的想法?我只有一个for循环。我尝试将其更改为foreach循环,但随后以错误的顺序打印。
答案 0 :(得分:1)
我没有检查您的完整代码,但请看一下这一行:
birth(childName, splitted[1], splitted[2], splitted[3]);
输入BIRTH会得到异常,因为splitted.length == 1并且它以BIRTH开头。
添加支票,例如:
if (firstLine.contains("BIRTH") && splitted.length == 4)
...
birth(childName, splitted[1], splitted[2], splitted[3]);
...
一般情况下,请尝试输入格式错误的程序。
回答你的评论:
如果您看一下您可以看到的出生方法,参数母亲和父亲可以是空或空字符串,因为它只是他们的名字,如果不存在具有该名称的人,则创建一个新的。我没有检查问题,如果这是正确的行为,但从代码可能。
private static void birth(
String child,
String date,
String mother,
String father)
所以你可以将条件改为:
// We need the childName and date, so splitted.length must be >= 2
if (firstLine.contains("BIRTH") && splitted.length >= 2)
{
String childName = splitted[0].substring(6);
if ( splitted.length == 2)
birth(
childName, // child name
splitted[1], // child birth date
"NoName1", // mothers name, check with your task what you should enter here
"NoName2"); // fathers name, check with your task what you should enter here
else if ( splitted.length == 3)
birth(
childName, // child name
splitted[1], // child birth date
splitted[2], // mothers name
"NoName"); // fathers name, check with your task what you should enter here
else if (splitted.length == 4)
birth(
childName, // child name
splitted[1], // child birth date
splitted[2], // mothers name
splitted[3]); // fathers name
}
但请检查您的任务是否应对省略的值使用某些默认值,例如父亲,母亲甚至日期和子名称。也许您只需要重新提示用户输入有效信息:
if (firstLine.contains("BIRTH") && splitted.length == 4)
...
birth(childName, splitted[1], splitted[2], splitted[3]);
...
else
// get the next input string
请注意,如果子名称不是至少6个字符,则以下行也会引发异常:
String childName = splitted[0].substring(6);