lauhin
10/15/2019 - 6:33 PM

Bereken het gelijkenispercentage tussen twee objecten in Java

Bereken het gelijkenispercentage tussen twee objecten in Java

Twee objecten van hetzelfde type worden met elkaar vergeleken. Als uitkomst krijg je een percentage van gelijkenis.

Code


public class Similarity {

    public int equalify(Object object1, Object object2) throws InstantiationException, IllegalAccessException {
        Map<String, Object> obj1Fields = getFieldNamesAndValues(object1);
        Map<String, Object> obj2Fields = getFieldNamesAndValues(object2);
        int same = 0;

        for (Map.Entry<String, Object> entry : obj1Fields.entrySet()) {
            Object val1 = entry.getValue();
            Object val2 = obj2Fields.get(entry.getKey());

            if (String.valueOf(val1).equals(String.valueOf(val2))) {
                same++;
            }
        }

        return (int) (((double) same / (double) obj1Fields.size()) * 100);
    }

    private Map<String, Object> getFieldNamesAndValues(final Object valueObj) throws IllegalArgumentException, IllegalAccessException {
        Class c1 = valueObj.getClass();
        Map<String, Object> fieldMap = new HashMap<String, Object>();
        Field[] valueObjFields = c1.getDeclaredFields();

        for (int i = 0; i < valueObjFields.length; i++) {
            String fieldName = valueObjFields[i].getName();
            valueObjFields[i].setAccessible(true);
            Object newObj = valueObjFields[i].get(valueObj);
            fieldMap.put(fieldName, newObj);
        }
        return fieldMap;
    }
}

Test


@Test
public void test() throws InstantiationException, IllegalAccessException {
    Equalifier equalifier = new Equalifier();    

    Contact contact1 = new Contact();
    Contact contact2 = new Contact();

    contact1.setLanguage("NL");
    contact1.setFirstname("Laurent");

    contact2.setLanguage("NL");
    contact2.setFirstname("Laurent");
    contact2.setLastname("Hinoul");

    assertEquals(equalifier.equalify(contact1, contact2), 66);
}