我試圖解決這個問題:https://kth.kattis.com/problems/genealogical,唯一的測試用例對我來說非常完美。但是如果我在第一行和第三行的第一條出生線上寫下第三條出生線,則會打印此錯誤:http://puu.sh/kJdBU/dcd693e466.png,這是錯誤的順序。有誰知道爲什麼以及如何解決這個問題,如果這是我的代碼?當輸入相同時,輸出順序發生變化,爲什麼?
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") && splitted.length >= 2) {
String childName = splitted[0].substring(6);
if (splitted.length == 4) {
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;
}
}
,這是我個人類:
import java.util.ArrayList;
import 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;
}
}
發生這種情況是因爲您更改了添加到列表中的人員的順序,並且只是將兩個查詢都添加到了該人員的列表中。 –
@PinkieSwirl好吧我怎麼能解決它,所以它是相同的輸入?這樣他們就不必爲了先打印祖先了? – user2597001
添加一個(排序的)列表以保存這兩個查詢,並在QUIT命令之後循環遍歷它(如果不允許直接打印輸出)。 –