/** * @param insertKey the key to insert * @param existingKey the existing key * @return the invert distance between <code>insertkey</code> and <code>existingKey</code>, * the higher the closer * @since 3.4 */ public static int invertDistance(String insertKey, String existingKey) { int existingKeyLength= existingKey.length(); int insertKeyLength= insertKey.length(); int minLen= Math.min(insertKeyLength, existingKeyLength); int prefixMatchCount= 0; for (int i= 0; i < minLen; i++) { if (insertKey.charAt(i) == existingKey.charAt(i)) { prefixMatchCount++; } else { return prefixMatchCount << 16; } } if (insertKeyLength > existingKeyLength && isSeparator(insertKey.charAt(existingKeyLength))) { //existing: prefix //new: prefix_xyz //insert it after existing key -> prefix match plus one return (prefixMatchCount + 1) << 16; } int existingLonger= existingKeyLength - insertKeyLength; // Sort by prefix match length first (<< 16). Existing keys that are longer // than the insertion key are not preferred insertion positions. return (prefixMatchCount << 16) - Math.max(0, existingLonger); }
/** * @param insertKey the key to insert * @param existingKey the existing key * @return the invert distance between <code>insertkey</code> and <code>existingKey</code>, * the higher the closer * @since 3.4 */ public static int invertDistance(String insertKey, String existingKey) { int existingKeyLength= existingKey.length(); int insertKeyLength= insertKey.length(); int minLen= Math.min(insertKeyLength, existingKeyLength); int prefixMatchCount= 0; for (int i= 0; i < minLen; i++) { if (insertKey.charAt(i) == existingKey.charAt(i)) { prefixMatchCount++; } else { return prefixMatchCount << 16; } } if (insertKeyLength > existingKeyLength && isSeparator(insertKey.charAt(existingKeyLength))) { //existing: prefix //new: prefix_xyz //insert it after existing key -> prefix match plus one return (prefixMatchCount + 1) << 16; } int existingLonger= existingKeyLength - insertKeyLength; // Sort by prefix match length first (<< 16). Existing keys that are longer // than the insertion key are not preferred insertion positions. return (prefixMatchCount << 16) - Math.max(0, existingLonger); }