From a88dee4c4b4cbebdb447f900bb2d5ed8c09687b0 Mon Sep 17 00:00:00 2001 From: david-swift Date: Mon, 1 Jan 2024 12:29:34 +0100 Subject: [PATCH] Fix crashing when source or target array empty --- .../LevenshteinTransformations.swift | 37 ++++++++++--------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/Sources/LevenshteinTransformations/LevenshteinTransformations.swift b/Sources/LevenshteinTransformations/LevenshteinTransformations.swift index 9aaf380..f3250e2 100644 --- a/Sources/LevenshteinTransformations/LevenshteinTransformations.swift +++ b/Sources/LevenshteinTransformations/LevenshteinTransformations.swift @@ -80,24 +80,27 @@ enum LevenshteinTransformations { operations[0][targetIndex] = .insert } - for sourceIndex in 1...sourceCount { - for targetIndex in 1...targetCount { - if source[sourceIndex - 1] == target[targetIndex - 1] { - editDistances[sourceIndex][targetIndex] = editDistances[sourceIndex - 1][targetIndex - 1] - operations[sourceIndex][targetIndex] = .noChange - } else { - editDistances[sourceIndex][targetIndex] = 1 + min( - editDistances[sourceIndex - 1][targetIndex - 1], - editDistances[sourceIndex - 1][targetIndex], - editDistances[sourceIndex][targetIndex - 1] - ) - if editDistances[sourceIndex][targetIndex] == editDistances[sourceIndex - 1][targetIndex - 1] + 1 { - operations[sourceIndex][targetIndex] = .replace - } else if editDistances[sourceIndex][targetIndex] - == editDistances[sourceIndex - 1][targetIndex] + 1 { - operations[sourceIndex][targetIndex] = .delete + if sourceCount > 0 && targetCount > 0 { + for sourceIndex in 1...sourceCount { + for targetIndex in 1...targetCount { + if source[sourceIndex - 1] == target[targetIndex - 1] { + editDistances[sourceIndex][targetIndex] = editDistances[sourceIndex - 1][targetIndex - 1] + operations[sourceIndex][targetIndex] = .noChange } else { - operations[sourceIndex][targetIndex] = .insert + editDistances[sourceIndex][targetIndex] = 1 + min( + editDistances[sourceIndex - 1][targetIndex - 1], + editDistances[sourceIndex - 1][targetIndex], + editDistances[sourceIndex][targetIndex - 1] + ) + if editDistances[sourceIndex][targetIndex] + == editDistances[sourceIndex - 1][targetIndex - 1] + 1 { + operations[sourceIndex][targetIndex] = .replace + } else if editDistances[sourceIndex][targetIndex] + == editDistances[sourceIndex - 1][targetIndex] + 1 { + operations[sourceIndex][targetIndex] = .delete + } else { + operations[sourceIndex][targetIndex] = .insert + } } } }