estàtic públic Classe Jarowinklerdistance {/ * La modificació de Winkler no s'aplicarà a menys que la coincidència * per cent es trobés al percentatge de mweighthreshold * sense la modificació. * El document de Winkler va utilitzar un valor per defecte de 0,7 * / estàtica privada readonly doble mwetalhreshold = 0,7; / * Mida del prefix per ser concidered per la modificació de Winkler. * El document de Winkler va utilitzar un valor per defecte de 4 * / privat estàtic readonly int mnumchars = 4; /// < Resum > /// retorna la distància de Jaro-Winkller entre les cordes especificades ///. La distància és simètrica i caurà a l'/// Range 0 (partit perfecte) a 1 (sense coincidència). /// < / Resum > /// < param name = "astring1" > Primera cadena < / param > /// < Param name = "astring2" > segona cadena < / param > /// < retorna > < / devolucions > Doble estàtica pública (cadena astring1, cadena astring2) {retorn 1.0 - proximitat (astring1, astring2); } /// < Resum > /// retorna la distància de Jaro-Winkler entre les cordes especificades ///. La distància és simètrica i caurà en el /// Range 0 (sense coincidència) a 1 (partit perfecte). /// < / Resum > /// < param name = "astring1" > Primera cadena < / param > /// < Param name = "astring2" > segona cadena < / param > /// < retorna > < / devolucions > Public Static Double Proximity (String Astring1, String Astring2) {int llen1 = astring1. length; int llen2 = astring2. length; si (llen1 == 0) torna llen2 == 0? 1.0: 0.0; int lsearchrange = math.max (0, math.max (llen1, llen2) / 2 - 1); // per defecte inicialitzat a false bool lmatched1 = Nou bool; bool lmatched2 = new bool; int lnumcommon = 0; per (int i = 0; i < Llen1; ++ i) {int lstart = math.max (0, i-lseargeRange); int pres = math.min (i + lsearchrange + 1, llen2); per a (int j = lstart; j < prestar; ++ j) {si (lmatched2) continuar; Si (Astring1! = Astring2) continua; lmatched1 = true; lmatched2 = true; ++ lnumcommon; trencar; }} si (lnumcommon == 0) torna 0.0; int lnumhalftransposted = 0; int k = 0; per (int i = 0; i < llen1; ++ i) {si (! LMatched1) continua; Mentre (! LMatched2) ++ K; Si (Astring1! = Astring2) ++ lnumhalftranspospós; ++ k; } // system.Diagnostics.debug.writeline ("numhalftransposposed =" + numhalftransposposed); int lnumtransposposed = lnumhalftransposposed / 2; // System.Diagnostics.debug.Writeline ("NumCommon =" + NUMCOMMON + "NUMTRANSPOST =" + NUMTRANSPOST); doble lnumcommond = lnumcommon; Double Lwight = (lnumcommond / llen1 + lnumcommond / llen2 + (lnumcommon - lnumtransposposta) / lnumcommond) /3.0; Si (Lwight < = mweighthreshold) torna lwight; int lmax = math.min (mnumchars, math.min (astring1. length, astring2.length)); int lpos = 0; Mentre (LPOS < LMAX & & astring1 == astring2) ++ lpos; Si (Lpos == 0) retornarà Lwight; Tornar Lwight + 0,1 * LPOS * (1.0 - Lwight); }}