2015-10-13 98 views
0

我試圖解決這個問題: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; 
} 


} 
+0

發生這種情況是因爲您更改了添加到列表中的人員的順序,並且只是將兩個查詢都添加到了該人員的列表中。 –

+0

@PinkieSwirl好吧我怎麼能解決它,所以它是相同的輸入?這樣他們就不必爲了先打印祖先了? – user2597001

+0

添加一個(排序的)列表以保存這兩個查詢,並在QUIT命令之後循環遍歷它(如果不允許直接打印輸出)。 –

回答

0

爲了讓你需要保存在某處命令的順序。

例如,你可以創建一個類,因爲你已經解析它:

public class OutputQuery 
{ 
    public final String command; 
    public final String name; 

    // Add other fields.. 

    public OutputQuery(String command, String name) 
    { 
     this.command = command; 
     this.name = name; 
    } 
} 

而且在主類中添加一個列表,並將它們添加到它:

private static List<OutputQuery> queries = new LinkedList<>(); 

// ... 

else if (firstLine.contains("ANCESTORS")) 
{ 
    String name = splitted[0].substring(10); 

    queries.add(new OutputQuery("ANCESTORS", name)); 

    //... 

else if (firstLine.contains("DESCENDANTS")) 
{ 
    String name = splitted[0].substring(12); 

    queries.add(new OutputQuery("DESCENDANTS", name)); 

    //... 

else if (firstLine.contains("QUIT")) 
{ 
    for (OutputQuery query : queries) 
    { 
     if (query.command == "ANCESTORS") 
     { 
      // Print output 
     } else if (query.command == "DESCENDANTS") 
     { 
      // Print output 
     } 
    } 

//... 

你不需要遍歷所有的人,只是查詢,就像你在上面的代碼中看到的那樣,查詢循環不在另一個循環中,這裏是完整的else if塊:

else if (firstLine.contains("QUIT")) 
{ 
    for (OutputQuery query : queries) 
    { 
     Person p = getPerson(query.name); 

     if (query.command == "ANCESTORS") 
     { 
      printAncestor(p); 
     } else if (query.command == "DESCENDANTS") 
     { 
      printDescendant(p); 
     } 
    } 

    System.exit(0); 
} 
+0

好吧,那麼也許像這樣:http://pastebin.com/vNjqat2X?這個時間複雜度將是n^2,儘管哪個並不好,但是。我現在看到,印刷了許多其他的東西:http://puu.sh/kJgPJ/44b1e575a0.png – user2597001

+0

看到我更新的答案。當然,你不會遍歷所有的人打印查詢,這就是爲什麼你會得到奇怪的輸出,因爲你將人名保存在查詢(命令)類中,爲什麼不使用它呢? –

+0

是的你的權利,我現在做了,並按正確的順序印刷它們。謝謝:) – user2597001

相關問題