You may use the following approach for searching.
Let say you have a criteria array that contain searching elements with priorities and you want to search which element in an input array matches the highest possibility.
Criteria array: [z, y, x, w]
(with priority [4, 3, 2, 1]
)
Input array: [wxyz, xz, yz, wz, z]
Sort the criteria array according to the priority. For example: [w, x, y, z]
Let the first element in criteria array as the searching key. For example: "w"
Filter all element in input array that started with the searching key. For example: [wxyz, wz]
If the result set contain nothing, use the next element as searching key. For example "x"
Otherwise, append the next element to current searching key. For example: "wx"
Repeat Step 3 until there is only one result left. For example: [wz]
However, If the final result set is empty, you may return the last result.
The following shows the implementation.
Search.java
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class Search {
public static void main(String[] args){
List<Criteria> criteria = new ArrayList<Criteria>();
criteria.add(new Criteria("z", 4));
criteria.add(new Criteria("y", 3));
criteria.add(new Criteria("x", 2));
criteria.add(new Criteria("w", 1));
Collections.sort(criteria);
List<String> input = Arrays.asList("wx", "wy", "wxy", "xy", "y", "yz", "z", "xyz");
System.out.println("Final Result: " + performSearch(input, criteria));
}
public static Set<String> performSearch(List<String> input, List<Criteria> criteria){
System.out.println("Start Searching " + criteria + " from " + input);
Set<String> resultSet = null;
int keyIdx = 0;
String searchingKey = "";
while(true){
if(keyIdx >= criteria.size()) break;
Set<String> tempResult = new HashSet<String>();
searchingKey = searchingKey + criteria.get(keyIdx).getValue();
System.out.println("Searching... Key = " + searchingKey);
for(String value : input){
if(value.startsWith(searchingKey)){
tempResult.add(value);
}
}
System.out.println("Result: " + tempResult);
if(tempResult.size() == 0){
searchingKey = searchingKey.substring(0, searchingKey.length()-1);
}else{
resultSet = tempResult;
if(resultSet.size() == 1){
break;
}
}
keyIdx++;
}
return resultSet;
}
}
Criteria.java
public class Criteria implements Comparable<Criteria> {
protected String _value;
protected int _priority;
public Criteria(String _value, int _priority) {
super();
this._value = _value;
this._priority = _priority;
}
public String getValue() {
return _value;
}
public void setValue(String _value) {
this._value = _value;
}
public int getPriority() {
return _priority;
}
public void setPriority(int _priority) {
this._priority = _priority;
}
@Override
public int compareTo(Criteria o) {
if(o.getPriority() == this._priority) return 0;
if(o.getPriority() > this._priority) return -1;
// smaller priority = higher priority
return 1;
}
public String toString(){
return this._value;
}
}
Execution Result:
Start Searching [w, x, y, z] from [wx, wy, wxy, xy, y, yz, z, xyz]
Searching... Key = w
Result: [wy, wx, wxy]
Searching... Key = wx
Result: [wx, wxy]
Searching... Key = wxy
Result: [wxy]
Final Result: [wxy]