최근에 인터뷰에서이 질문을 받았는데 테스트 케이스가 만족되었는지 확인하기 위해 실행해야하는 클래스와 테스트 클래스가 주어졌습니다. 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() 메서드 만 채워야 나머지 코드는 문제가 없다고 가정합니다.
편집 : 여기에 세트를 사용하도록 요청 받았지만 선택 사항이 아닙니다.
저는 세트가 비어있을 것이라고 생각하지 않습니다. 테스트 케이스가 실패했기 때문에 이것을 말하고 있습니까? – sanbhat
나는 많은 자바를 사용하지 않지만'addParent'에서는'this.parents.add (parent);'를하지만'getParents'에서'return parents;'를하고'return this.parents ;'? – towr
@ towr는 중요하지 않습니다. – sanbhat