Calculate Family Relationship from Genealogical Data

后端 未结 6 2147
萌比男神i
萌比男神i 2021-01-30 11:36

I would like to be able to calculate the family relationship between two individuals in a family tree, given the following data schema (simplified from my actual data schema, on

6条回答
  •  死守一世寂寞
    2021-01-30 12:31

    I solved this problem using adjacency list concept in java. One can have a node for every person and have its child relations associated to it on its node itself. Below is the code to find only Siblings and Cousins. However, you can enhance it according to your requirement. I wrote this code only for demonstration.

    public class Person {
        String name;
        String gender;
        int age;
        int salary;
        String fatherName;
        String motherName;
    
        public Person(String name, String gender, int age, int salary, String fatherName,
                String motherName) {
            super();
            this.name = name;
            this.gender = gender;
            this.age = age;
            this.salary = salary;
            this.fatherName = fatherName;
            this.motherName = motherName;
        }
    
    }
    

    Below is the main code to add family people and to find relation among themselves.

    import java.util.LinkedList;
    
    public class PeopleAndRelationAdjacencyList {
        private static String MALE = "male";
        private static String FEMALE = "female";
    
    public static void main(String[] args) {
        int size = 25;
        LinkedList adjListArray[] = new LinkedList[size];
        for (int i = 0; i < size; i++) {
            adjListArray[i] = new LinkedList<>();
        }
    
        addPerson( adjListArray, "GGM1", MALE, null, null );
        addPerson( adjListArray, "GGF1", FEMALE, null, null );
    
        addPerson( adjListArray, "GM1", MALE, "GGM1", "GGF1" );
        addPerson( adjListArray, "GM2", MALE, "GGM1", "GGF1" );
    
        addPerson( adjListArray, "GM1W", FEMALE, null, null );
        addPerson( adjListArray, "GM2W", FEMALE, null, null );
    
        addPerson( adjListArray, "PM1", MALE, "GM1", "GM1W" );
        addPerson( adjListArray, "PM2", MALE, "GM1", "GM1W" );
        addPerson( adjListArray, "PM3", MALE, "GM2", "GM2W" );
    
        addPerson( adjListArray, "PM1W", FEMALE, null, null );
        addPerson( adjListArray, "PM2W", FEMALE, null, null );
        addPerson( adjListArray, "PM3W", FEMALE, null, null );
    
        addPerson( adjListArray, "S1", MALE, "PM1", "PM1W" );
        addPerson( adjListArray, "S2", MALE, "PM2", "PM2W" );
        addPerson( adjListArray, "S3", MALE, "PM3", "PM3W" );
        addPerson( adjListArray, "S4", MALE, "PM3", "PM3W" );
    
        printGraph(adjListArray);
        System.out.println("Done !");
    
    
        getRelationBetweenPeopleForGivenNames(adjListArray, "S3", "S4");
        getRelationBetweenPeopleForGivenNames(adjListArray, "S1", "S2");
    
    }
    
    
    private static void getRelationBetweenPeopleForGivenNames(LinkedList[] adjListArray, String name1, String name2) {
    
        if ( adjListArray[getIndexOfGivenNameInHeadPositionOfList(adjListArray, name1)].peekFirst().fatherName
                .equalsIgnoreCase(
                        adjListArray[getIndexOfGivenNameInHeadPositionOfList(adjListArray, name2)].peekFirst().fatherName) ) {
            System.out.println("SIBLIGS");
            return;
        }
    
        String name1FatherName = adjListArray[getIndexOfGivenNameInHeadPositionOfList(adjListArray, name1)].peekFirst().fatherName;
        String name2FatherName = adjListArray[getIndexOfGivenNameInHeadPositionOfList(adjListArray, name2)].peekFirst().fatherName;
    
        if ( adjListArray[getIndexOfGivenNameInHeadPositionOfList(adjListArray, name1FatherName)].peekFirst().fatherName
                .equalsIgnoreCase(
                        adjListArray[getIndexOfGivenNameInHeadPositionOfList(adjListArray, name2FatherName)].peekFirst().fatherName) ) {
            System.out.println("COUSINS");
        }
    }
    
    
    
    private static void addPerson(LinkedList[] adjListArray, String name, String gender, String fatherName, String motherName) {
        Person person = new Person(name, gender, 0, 0, fatherName, motherName);
        int indexToPutperson = getEmptyIndexInAdjListToInserterson(adjListArray);
        adjListArray[indexToPutperson].addLast(person);
        if( fatherName!=null ){
            int indexOffatherName = getIndexOfGivenNameInHeadPositionOfList( adjListArray, fatherName);
            adjListArray[indexOffatherName].addLast(person);
        }
        if( motherName!=null ){
            int indexOfMotherName = getIndexOfGivenNameInHeadPositionOfList( adjListArray, motherName);
            adjListArray[indexOfMotherName].addLast(person);
        }
    }
    
    private static int getIndexOfGivenNameInHeadPositionOfList( LinkedList[] adjListArray, String nameToBeSearched ) {
        for (int i = 0; i < adjListArray.length; i++) {
            if( adjListArray[i] != null ){
                if(adjListArray[i].peekFirst() != null){
                    if(adjListArray[i].peekFirst().name.equalsIgnoreCase(nameToBeSearched)){
                        return i;
                    }
                }
            }
        }
        // handle if father name is not found
        return 0;
    }
    
    
    private static void printGraph(LinkedList[] adjListArray) {
        for (int v = 0; v < 15; v++) {
            System.out.print("head");
    
            LinkedList innerLinkedList = adjListArray[v];
            for (int i = 0; i < innerLinkedList.size(); i++) {
                Person person = innerLinkedList.get(i);
                System.out.print(" -> " + person.name);
            }
    
            System.out.println("\n");
        }
    }
    
    private static int getEmptyIndexInAdjListToInserterson( LinkedList[] adjListArray) {
        for (int i = 0; i < adjListArray.length; i++) {
            if(adjListArray[i].isEmpty()){
                return i;
            }
        }
        throw new IndexOutOfBoundsException("List of relation is full.");
    }
    

    }

提交回复
热议问题