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]