【发布时间】:2016-01-09 07:01:47
【问题描述】:
我正在尝试解决这个问题:https://kth.kattis.com/problems/genealogical,那里唯一对我来说完美的测试用例。但是更正它的机器人说 ArrayIndexOutOfBounds 但不是在哪里,我已经查看过但找不到它。我添加了一些东西,比如第 19 行的 if 语句。这是我的代码:
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Genealogical {
private static List<Person> persons = new ArrayList<Person>();
public static void main(String[] args)
{
Scanner input = new Scanner(System.in);
while(true)
{
String firstLine = input.nextLine();
String[] splitted = firstLine.split(" : ");
if(splitted.length == 0)
{
System.exit(0);
}
if(firstLine.contains("BIRTH"))
{
String childName = splitted[0].substring(6);
birth(childName, splitted[1], splitted[2], splitted[3]);
}
else if(firstLine.contains("DEATH"))
{
if(!firstLine.contains(" : "))
{
if(persons.size() > 0)
persons.get(persons.size() - 1).kill(firstLine.substring(6));
}
else
{
String name = splitted[0].substring(6);
getPerson(name).kill(splitted[1]);
}
}
else if(firstLine.contains("ANCESTORS"))
{
String name = splitted[0].substring(10);
Person ancestor = getPerson(name);
for(Person p : persons)
{
if(p.getName().equals(name) || p.used)
{
continue;
}
else
{
p.used = true;
ancestor.addAncestors(p);
}
}
}
else if(firstLine.contains("DESCENDANTS"))
{
String name = splitted[0].substring(12);
Person descendant = getPerson(name);
for(Person p : persons)
{
if(p.getName().equals(name) || p.used)
{
continue;
}
else
{
p.used = true;
descendant.addDescendants(p);
}
}
}
else if(firstLine.contains("QUIT"))
{
if(persons.size() > 0)
{
for(int i = persons.size() - 1; i >= 0; i--)
{
Person p = persons.get(i);
if(p.getAncestors().size() > 0)
{
printAncestor(p);
}
if(p.getDescendants().size() > 0)
{
printDescendant(p);
}
}
}
System.exit(0);
}
}
}
public static void printAncestor(Person p)
{
System.out.println("ANCESTORS of " + p.getName());
for(Person ancestor : p.getAncestors())
{
System.out.println(" " + ancestor.getName() + " " + ancestor.getDate() + " -" + ancestor.getDeathdate());
System.out.println(" " + ancestor.getDad().getName());
System.out.println(" " + ancestor.getMom().getName());
}
System.out.println();
}
public static void printDescendant(Person p)
{
System.out.println("DESCENDANTS of " + p.getName());
for(Person descendant : p.getDescendants())
{
System.out.println(" " + descendant.getName() + " " + descendant.getDate() + " -" + descendant.getDeathdate());
}
}
private static void birth(String child, String date, String mother, String father)
{
Person mom = getPerson(mother);
if(mom == null)
{
mom = new Person(null, null);
mom.setName(mother);
}
Person dad = getPerson(father);
if(dad == null)
{
dad = new Person(null, null);
dad.setName(father);
}
Person childd = new Person(mom, dad);
childd.setName(child);
childd.setDate(date);
persons.add(childd);
}
private static Person getPerson(String person)
{
for(Person p : persons)
{
if(p.getName().equals(person))
{
return p;
}
}
return null;
}
}
这是我的person-class: 导入 java.util.ArrayList; 导入 java.util.List;
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;
}
}
有人对可能出现的问题有任何想法吗?我只有一个 for 循环。我尝试将其更改为 foreach 循环,但它以错误的顺序打印。
【问题讨论】:
-
如果机器人没有告诉您错误在哪里,请尝试自己执行整个程序,这样您可以获得更多关于错误位置的信息。
-
好吧,我不知道要更改哪些信息,除了不会更改任何内容的名称。