2014-02-21 81 views
0

我最近在一次採訪中被問到了這個問題,給了我一個類和一個測試程序類,我不得不運行它來檢查測試用例是否滿足。我必須編寫addParent(),getParent(),addChild(),getChild(),setSpouse(),getSpouse,hasSpouse()和isRelated()方法。我得到了1小時,這是我能想出的。自3天以來,我一直在嘗試調試,但添加父母和孩子後,我只能看到空集。在調試時遇到麻煩 - 空集

下面是我的代碼:

package kashyap; 
    import java.util.Set; 
    import java.util.HashSet; 

    public class MyPerson implements Person { 
//declarations 
    private String name; 
    private long ssn; 
    private char gender; 
    //private Person parent; 
    private Set<Person> parents = new HashSet<Person>(); 
    private Set<Person> children = new HashSet<Person>(); 
    private Person spouse = null; 
//methods 
    public String getName() { 
     return name; 
    } 


    public void setName(String name) { 
     this.name = name; 
    } 


    public long getSSN() { 
     return ssn; 
    } 


    public void setSSN(long ssn) { 
     this.ssn = ssn; 
    } 


    public char getGender() { 
     return gender; 
    } 


    public void setGender(char gender) { 
     this.gender = gender; 
    } 

    public MyPerson(String name, long ssn, char gender) { 

     this.name = name; 
     this.ssn = ssn; 
     this.gender = gender; 

    } 


    public void addParent(Person parent) { 
     // TODO Auto-generated method stub 
     this.parents.add(parent); 
    } 

    public Set<Person> getParents() { 
     // TODO Auto-generated method stub 
     if(parents.isEmpty()) 
     { 
      return null; 
     } 
     else 
     { 
      return parents; 
     } 
    } 

    public void addChild(Person child) { 
     // TODO Auto-generated method stub 
     this.children.add(child); 
    } 

    public Set<Person> getChildren() { 
     // TODO Auto-generated method stub 
     if(children.isEmpty()) 
     { 
      return null; 
     } 
     else 
     { 
      return children; 
     } 
    } 

    public void setSpouse(Person spouse) { 
     // TODO Auto-generated method stub 
     this.spouse = spouse; 
    } 

    public Person getSpouse() { 
     // TODO Auto-generated method stub 
     if(spouse != null) 
     { 
      return spouse; 
     } 
     else 
     { 
      return null; 
     } 
    } 

    public boolean hasSpouse() { 
     // TODO Auto-generated method stub 
     if(spouse != null) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 

    public boolean isRelated(Person person) { 
     // TODO Auto-generated method stub 

     boolean related = false; 

     if (parents.contains(person) || children.contains(person) || person == spouse) 
     { 
      return true; 
     } 

     Set<Person> set_p = person.getParents(); 
     Set<Person> set_c = person.getChildren(); 
     Person s = person.getSpouse(); 

     Set<Person> relatives = new HashSet<Person>(); 

     if(set_p != null){ 
      for(Person p : set_p) 
      { 
       relatives.add(p); 
      } 
     } 
     if(set_c != null){ 
      for(Person c : set_c) 
      { 
       relatives.add(c);  
      } 
     } 

      relatives.add(s); 


     for(Person x : relatives){ 
      related = isRelated(x); 
      if(related == true) 
       return true; 
     } 
     return false; 
    } 
} 

測試儀類:

package kashyap; 

public class PersonTester { 

    public static void main(String[] args) { 

     PersonTester tester = new PersonTester(); 
     tester.testGrandChildToGreatGrandMotherRelationship(1); 
     tester.testManToStrangerRelationship(3); 
     tester.testGruncleRelationship(4); 
     tester.testManToWifesCousinRelationship(5); 
    } 


    public void testManToWifesCousinRelationship(int testId) { 
     // man 
     Person jack = new MyPerson("Jack", 1, Person.MALE);  

     // wife 
     Person jill = new MyPerson("Jill", 2, Person.FEMALE); 
     jack.setSpouse(jill); 

     // wife's mother 
     Person beth = new MyPerson("Beth", 3, Person.FEMALE); 
     jill.addParent(beth); 

     // wife's grandmother 
     Person mary = new MyPerson("Mary", 4, Person.FEMALE); 
     beth.addParent(mary); 

     // wife's uncle 
     Person dave = new MyPerson("Dave", 5, Person.MALE); 
     mary.addChild(dave); 

     //wife's aunt 
     Person sally = new MyPerson("Sally", 6, Person.FEMALE); 
     dave.setSpouse(sally); 

     // wife's cousin 
     Person andrew = new MyPerson("Andrew", 7, Person.MALE); 
     sally.addChild(andrew); 

     // wife's cousin's wife 
     Person janet = new MyPerson("Janet", 8, Person.FEMALE); 
     andrew.setSpouse(janet); 

     // same person as janet...only related through SSN 
     Person bigJ = new MyPerson("Janet", 8, Person.FEMALE); 



     this.performTestAndPrintResults(testId, jack, janet, "Wife's Cousin", true); 
     // test the reverse relationship 
     this.performTestAndPrintResults(testId + 1, janet, jack, "Cousin's Husband", true); 
     // test relationship through SSN 
     this.performTestAndPrintResults(testId + 2, jack, bigJ, "With Janet being called by her nick name", true); 

    } 

    private void performTestAndPrintResults(int testCaseNumber, Person p1, Person p2, String relationship, boolean related) { 

     String relatedOrNot = "not related"; 
     if(related) { 
      relatedOrNot = "related"; 
     } 

     System.out.print("TEST CASE #" + testCaseNumber); 
     if(p1.isRelated(p2) == related) { 
      System.out.print("(PASS): " + p1.getName() + " and " + p2.getName() + "(" + relationship + ") are " + relatedOrNot + ". Your code agrees!\n"); 
     } 
     else { 
      System.out.print("(FAIL): " + p1.getName() + " and " + p2.getName() + "(" + relationship + ") are " + relatedOrNot + ". Your code disagrees!\n"); 
     } 

    } 


    public void testManToStrangerRelationship(int testId) { 

     Person jack = new MyPerson("Jack" , 1, Person.MALE); 
     Person stranger = new MyPerson("Perry" , 2, Person.MALE); 

     this.performTestAndPrintResults(testId, jack, stranger, "Stranger", false); 

    } 


    public void testGrandChildToGreatGrandMotherRelationship(int testId) { 

     Person man = new MyPerson("Jack", 1, Person.MALE); 

     //mother 
     Person mother = new MyPerson("Jill", 2, Person.FEMALE); 
     man.addParent(mother); 

     // grandMother 
     Person gm = new MyPerson("Beth", 3, Person.FEMALE); 
     mother.addParent(gm); 

     // great-grandMother 
     Person ggm = new MyPerson("Mary", 4, Person.FEMALE); 
     gm.addParent(ggm); 

     //child 
     Person child = new MyPerson("Peter", 5, Person.MALE); 
     man.addChild(child); 

     //grandChild 
     Person grandChild = new MyPerson("Dave", 6, Person.MALE); 
     child.addChild(grandChild); 

     // is my grandChild related to my great-grandMother 
     this.performTestAndPrintResults(testId, grandChild, ggm, "Great-Great-Great-GrandMa", true); 
     this.performTestAndPrintResults(testId + 1, ggm, grandChild, "Great-Great-Great-GrandChild", true); 
    } 


    public void testGruncleRelationship(int testId) { 

     // A gruncle is someone who is both a Grandfather & an Uncle to another person 

     // child 
     Person child = new MyPerson("Billy", 0, Person.MALE); 

     Person father = new MyPerson("Jack", 1, Person.MALE);  
     Person mother = new MyPerson("Jill", 2, Person.FEMALE); 
     father.setSpouse(mother); 
     father.addChild(child); 

     // father's father (grand father) 
     Person grandPa = new MyPerson("Dave", 3, Person.MALE); 
     father.addParent(grandPa); 

     // mother's sister (aunt) 
     Person gm = new MyPerson("Beth", 4, Person.FEMALE); 
     mother.addParent(gm);   
     Person aunt = new MyPerson("Shelly", 5, Person.FEMALE); 
     gm.addChild(aunt); 

     // father's father falls for mother's sister 
     //(code to test looping due to double relationships) 
     grandPa.setSpouse(aunt); 

     Person gruncle = grandPa; 
     // am i related to wife's uncle's wife? 
     this.performTestAndPrintResults(testId, child, gruncle, "Gruncle", true); 


    } 

} 

有其實現這一切的另一個接口:

package kashyap; 

import java.util.Set; 

public interface Person { 

     static final char MALE = 'M'; 
     static final char FEMALE = 'F'; 

     // name 
     String getName(); 
     void setName(String name); 

     //ssn 
     long getSSN(); 
     void setSSN(long ssn); 

     //gender 
     char getGender(); 
     void setGender(char gender); 

     // relationships 
     void addParent(Person parent); 
     Set<Person> getParents(); 

     void addChild(Person child); 
     Set<Person> getChildren(); 

     void setSpouse(Person spouse); 
     Person getSpouse(); 

     // returns true if the person is married 
     boolean hasSpouse();   
     // returns true if the person is related, false otherwise 
     boolean isRelated(Person person); 
} 

有人能告訴我爲什麼所有的套都是空的?我只需要填充addParent(),getParent(),addChild(),getChild(),setSpouse(),getSpouse,hasSpouse()和isRelated()方法,因此我假設其餘的代碼都很好。

編輯:我被要求在這裏使用集,而不是一個選擇。

+0

我不認爲設置將是空的。你說這是因爲測試用例失敗? – sanbhat

+0

我不會做太多的java,但在'addParent'中你做'this.parents.add(parent);'但是在'getParents'中你做'返回父母','不應該'返回this.parents ;'? – towr

+0

@towr那沒關係 – sanbhat

回答

1

按照我的你的Set s不是空的。我可以發現,因爲isRelated(Person person)你正在檢查parents.contains(person)你沒有MyPerson

例如在方法重寫equals()hashcode()(爲HashSet),其要領檢查平等一個原因,你的測試用例執行失敗person與所有元素parents