All Downloads are FREE. Search and download functionalities are using the official Maven repository.

at.chrl.algorithms.search.SearchUtil Maven / Gradle / Ivy

The newest version!
package at.chrl.algorithms.search;

import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * Search Util
 *
 * Created by Vinzynth on 14.08.2014.
 */
public class SearchUtil {

	/**
	 * Search method which return given search pool ordered by search result. 
* Returned set may not contain every element of given set. * * * @param searchPool * given search pool * @param searchKey * given search key * @return sorted pool */ public static String[] search(final Set searchPool, final String searchKey) { if (searchKey.isEmpty()) return new String[0]; final char[] searchKeyChars = searchKey.toLowerCase().toCharArray(); final char[] searchKeyCharsUpper = searchKey.toUpperCase().toCharArray(); final int searchKeyCharsLength = searchKey.length(); return streamSearch(searchPool, searchKeyChars, searchKeyCharsUpper, searchKeyCharsLength); } private static double getScore(final String s, final char[] keyChars, final char[] keyCharsUpper, final int keyCharsLength) { double score = keyCharsLength; int charIndex = 0; int lastScored = 0; double fac = .5; final char[] arr = s.toCharArray(); final int length = arr.length; for (int i = 0; i < length; i++) { char c = arr[i]; if (keyCharsUpper[charIndex] == c) { int facCounter = i - lastScored; while (facCounter-- > 0) fac *= .99; lastScored = i; score -= fac; if (i == 0 || !Character.isLetter(arr[i - 1])) score -= fac; if (++charIndex >= keyCharsLength) break; } else if (keyChars[charIndex] == c) { int facCounter = i - lastScored; while (facCounter-- > 0) fac *= .99; lastScored = i; score -= fac / 2; if (++charIndex >= keyCharsLength) break; } } return score; } private static String[] streamSearch(final Set searchPool, final char[] keyChars, final char[] keyCharsUpper, final int keyCharsLength) { Map> m = searchPool.stream().collect(Collectors.groupingBy(s -> SearchUtil.getScore(s, keyChars, keyCharsUpper, keyCharsLength))); m.remove(keyCharsLength); return m.entrySet().stream().sorted((e1, e2) -> Double.compare(e1.getKey(), e2.getKey())).flatMap(e -> e.getValue().stream()).toArray(String[]::new); } public static int indexSearch(final double value, final int size, final double[] array) { if (value <= array[0] || size <= 0) return 0; if (value >= array[size - 1]) return size; int i = size >>> 1; while (array[i] > value) i = i >>> 1; if (array[i + 1] >= value) return i + 1; int o = i >>> 1; while (true) { while (array[i + o] > value) i = i >>> 1; if (array[i + o + 1] >= value) return i + o + 1; o += i >>> 1; } } public static int indexSearch(final int value, final int size, final int[] array) { if (value <= array[0] || size <= 0) return 0; if (value >= array[size - 1]) return size; int i = size >>> 1; int o = 0; while (true) { while (array[i + o] > value) i = i >>> 1; if (array[i + o + 1] >= value) return i + o + 1; o += i >>> 1; } } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy