2014-02-21 2 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; 

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); 
} 

누군가가 나에게 이유를 알려 주시기 바랍니다 수 :이 모든 것을 구현 된 다른 인터페이스가 있었다

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); 


    } 

} 

모든 세트는 비어 있었습니까? addParent(), getParent(), addChild(), getChild(), setSpouse(), getSpouse, hasSpouse() 및 isRelated() 메서드 만 채워야 나머지 코드는 문제가 없다고 가정합니다.

편집 : 여기에 세트를 사용하도록 요청 받았지만 선택 사항이 아닙니다.

+0

저는 세트가 비어있을 것이라고 생각하지 않습니다. 테스트 케이스가 실패했기 때문에 이것을 말하고 있습니까? – sanbhat

+0

나는 많은 자바를 사용하지 않지만'addParent'에서는'this.parents.add (parent);'를하지만'getParents'에서'return parents;'를하고'return this.parents ;'? – towr

+0

@ towr는 중요하지 않습니다. – sanbhat

답변

1

고객님의 Set은 (는) 비어 있지 않습니다. 수표 평등 필수품하는 당신이 parents.contains(person)을 확인하는 isRelated(Person person) 당신이 MyPerson 수업 방법의 예를 들어

에 (HashSet에 대한) equals()hashcode()를 오버라이드 (override)하지 않은, 때문에 테스트 케이스가 실패하는 이유 중 하나를 발견 할 수 있습니다person이고 모든 요소는 parents입니다.