Skip to content

Commit

Permalink
Vergleich von Namen mit mehreren Vornamen ist jetzt toleranter
Browse files Browse the repository at this point in the history
  • Loading branch information
oboehm committed Feb 27, 2019
1 parent 516570e commit 8f48499
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 6 deletions.
1 change: 1 addition & 0 deletions doc/release-notes.adoc
Expand Up @@ -5,6 +5,7 @@
== 2.2.1 (SNAPSHOT)

* Adressvergleich kommt jetzt mit mehr Sonderfällen klar
* Namensvergleich funktioniert jetzt auch mit unterschiedlicher Anzahl von Vornamen besser


== 2.2 (27-Feb-2019)
Expand Down
49 changes: 43 additions & 6 deletions src/main/java/de/jfachwert/post/Name.java
Expand Up @@ -23,6 +23,9 @@
import de.jfachwert.pruefung.NullValidator;
import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.WeakHashMap;

/**
Expand Down Expand Up @@ -78,18 +81,32 @@ public static Name of(String name) {
* @return z.B. "Duck"
*/
public String getNachname() {
return StringUtils.substringBefore(getCode(), ",");
return StringUtils.substringBefore(getCode(), ",").trim();
}

/**
* Liefert den oder die Nachnamen.
* Liefert den oder die Vornamen als ein String.
*
* @return z.B. "Donald"
*/
public String getVorname() {
return StringUtils.substringAfter(getCode(), ",").trim();
}

/**
* Falls mehr als ein Vornamen exisitiert, kann dies hierueber als Liste
* von Vornamen angefragt werden.
*
* @return Liste mit Vornamen (kann auch leer sein)
*/
public List<String> getVornamenListe() {
if (hasVorname()) {
return Arrays.asList(getVorname().split("\\s"));
} else {
return new ArrayList<>();
}
}

/**
* Liefert 'true' zurueck, falls ein Vorname im abgespeicherten Namen
* enthalten ist.
Expand All @@ -102,7 +119,7 @@ public boolean hasVorname() {

@Override
public int hashCode() {
return normalize(this).toLowerCase().hashCode();
return Text.replaceUmlaute(this.getNachname()).toLowerCase().hashCode();
}

/**
Expand All @@ -119,11 +136,31 @@ public boolean equals(Object obj) {
return false;
}
Name other = (Name) obj;
return normalize(this).equalsIgnoreCase(normalize(other));
return isEquals(normalize(this), normalize(other));
}

private static String normalize(Name name) {
return StringUtils.deleteWhitespace(name.replaceUmlaute().toString().replace("-", ""));
private static Name normalize(Name name) {
return Name.of(name.replaceUmlaute().toString().replace("-", " ").trim());
}

private static boolean isEquals(Name a, Name b) {
return a.getNachname().equalsIgnoreCase(b.getNachname()) &&
(shortenVorname(a).equalsIgnoreCase(shortenVorname(b)) ||
equalsVornamen(a.getVornamenListe(), b.getVornamenListe()));
}

private static String shortenVorname(Name x) {
return StringUtils.deleteWhitespace(x.getVorname().replace("-", ""));
}

private static boolean equalsVornamen(List<String> a, List<String> b) {
int n = Math.min(a.size(), b.size());
for (int i = 0; i < n; i++) {
if (!a.get(i).equalsIgnoreCase(b.get(i))) {
return false;
}
}
return true;
}

/**
Expand Down
24 changes: 24 additions & 0 deletions src/test/java/de/jfachwert/post/NameTest.java
Expand Up @@ -21,6 +21,9 @@
import org.junit.Test;
import patterntesting.runtime.junit.ObjectTester;

import java.util.List;

import static org.hamcrest.Matchers.empty;
import static org.junit.Assert.*;

/**
Expand Down Expand Up @@ -55,6 +58,20 @@ public void testHasVorname() {
assertFalse(Name.of("Duck").hasVorname());
}

@Test
public void testGetVornamenListe() {
List<String> vornamen = Name.of("Was, Karl Otto").getVornamenListe();
assertEquals(2, vornamen.size());
assertEquals("Karl", vornamen.get(0));
assertEquals("Otto", vornamen.get(1));
}

@Test
public void testGetLeereVornamenListe() {
List<String> vornamen = Name.of("Nobody").getVornamenListe();
assertThat(vornamen, empty());
}

/**
* Umlaute sollten beim Vergleich keine Rolle spielen. Ebenso Gross- und
* Kleinschreibung.
Expand Down Expand Up @@ -97,4 +114,11 @@ public void testEqualsKarlHeinz() {
ObjectTester.assertEquals(b, c);
}

@Test
public void testEquals2Vornamen() {
Name karl = Name.of("Otto, Karl");
Name karlheinz = Name.of("Otto, Karl Heinz");
ObjectTester.assertEquals(karl, karlheinz);
}

}

0 comments on commit 8f48499

Please sign in to comment.