From 79621cd88810f8e446d45099a46c17bf23bd9741 Mon Sep 17 00:00:00 2001 From: PHJ2000 <105151063+PHJ2000@users.noreply.github.com> Date: Mon, 5 Oct 2026 21:08:00 +0900 Subject: [PATCH] Apply insertion and deletion weights to empty strings --- .../stringsimilarity/WeightedLevenshtein.java | 12 ++++++++-- .../WeightedLevenshteinTest.java | 24 +++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/main/java/info/debatty/java/stringsimilarity/WeightedLevenshtein.java b/src/main/java/info/debatty/java/stringsimilarity/WeightedLevenshtein.java index 69413e2..65497a6 100644 --- a/src/main/java/info/debatty/java/stringsimilarity/WeightedLevenshtein.java +++ b/src/main/java/info/debatty/java/stringsimilarity/WeightedLevenshtein.java @@ -93,11 +93,19 @@ public final double distance(final String s1, final String s2, } if (s1.length() == 0) { - return s2.length(); + double cost = 0; + for (int i = 0; i < s2.length(); i++) { + cost += insertionCost(s2.charAt(i)); + } + return cost; } if (s2.length() == 0) { - return s1.length(); + double cost = 0; + for (int i = 0; i < s1.length(); i++) { + cost += deletionCost(s1.charAt(i)); + } + return cost; } // create two work vectors of floating point (i.e. weighted) distances diff --git a/src/test/java/info/debatty/java/stringsimilarity/WeightedLevenshteinTest.java b/src/test/java/info/debatty/java/stringsimilarity/WeightedLevenshteinTest.java index c036423..4b483af 100644 --- a/src/test/java/info/debatty/java/stringsimilarity/WeightedLevenshteinTest.java +++ b/src/test/java/info/debatty/java/stringsimilarity/WeightedLevenshteinTest.java @@ -96,4 +96,28 @@ public double insertionCost(char c) { NullEmptyTests.testDistance(instance); } + + @Test + public void emptyStringsUseCharacterInsertionCosts() { + WeightedLevenshtein distance = weightedDistance(); + assertEquals(2.5, distance.distance("", "ab"), 0.000001); + assertEquals(2.5, distance.distance("", "ab", Double.MAX_VALUE), 0.000001); + } + + @Test + public void emptyStringsUseCharacterDeletionCosts() { + WeightedLevenshtein distance = weightedDistance(); + assertEquals(4.75, distance.distance("ab", ""), 0.000001); + assertEquals(4.75, distance.distance("ab", "", Double.MAX_VALUE), 0.000001); + } + + private WeightedLevenshtein weightedDistance() { + return new WeightedLevenshtein(new CharacterSubstitutionInterface() { + public double cost(char a, char b) { return 1.0; } + }, new CharacterInsDelInterface() { + public double insertionCost(char c) { return c == 'a' ? 0.5 : 2.0; } + public double deletionCost(char c) { return c == 'a' ? 0.75 : 4.0; } + }); + } + } \ No newline at end of file