Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何根据优先级搜索具有最大匹配条件的元素_Java_Algorithm - Fatal编程技术网

Java 如何根据优先级搜索具有最大匹配条件的元素

Java 如何根据优先级搜索具有最大匹配条件的元素,java,algorithm,Java,Algorithm,e、 g我有四个具有相关元素的对象: A1={test1,test2,test4} A2={test1} A3={test1,test3} A4={test1,test2} 需要搜索排名为1,2,3的test1、test2、test3参数。 所以我的第一次搜索应该是所有匹配的条件{test1,test2,test3) 结果没有任何因素 然后第二个搜索应该是{test1,test2} 结果-A4元素匹配 这里不考虑A1,因为A1有额外的参数test4。 所以规则是精确匹配或更少匹配,但元素不应该

e、 g我有四个具有相关元素的对象:

A1={test1,test2,test4}
A2={test1}
A3={test1,test3}
A4={test1,test2}
需要搜索排名为1,2,3的test1、test2、test3参数。 所以我的第一次搜索应该是所有匹配的条件{test1,test2,test3) 结果没有任何因素 然后第二个搜索应该是{test1,test2} 结果-A4元素匹配 这里不考虑A1,因为A1有额外的参数test4。 所以规则是精确匹配或更少匹配,但元素不应该有额外的参数,所以若有三个参数,那个么我需要按照以下顺序执行搜索,从可能的最高组合开始,然后按照较低的顺序

priority1 will be {test1,test2,test3},
priority2 will be {test1,test2},
priority3 will be {test1,test3},
priority4 will be {test1},
priority5 will be {test2,test3},
priority6 will be {test2},
priority7 will be {test3}

这里没有参数可以是n…所以我想要一些通用的解决方案来编程。

您可以使用以下方法进行搜索

假设您有一个条件数组,其中包含具有优先级的搜索元素,并且您希望搜索输入数组中与最高可能性匹配的元素

标准数组:
[z,y,x,w]
(具有优先级
[4,3,2,1]

输入数组:
[wxyz,xz,yz,wz,z]

  • 根据优先级对标准数组进行排序。例如:
    [w,x,y,z]

  • 条件数组中的第一个元素作为搜索键。例如:
    “w”

  • 过滤输入数组中以搜索键开头的所有元素。例如:
    [wxyz,wz]

  • 如果结果集不包含任何内容,请使用下一个元素作为搜索键。例如
    “x”
    否则,将下一个元素附加到当前搜索键。例如:
    “wx”

  • 重复步骤3,直到只剩下一个结果。例如:
    [wz]

  • 但是,如果最终结果集为空,则可以返回最后一个结果

  • 下面显示了实现

    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;
        }
    
    }
    
    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;
        }
    
    }
    

    你能给我们展示一些试图解决你的问题的Java代码吗?我觉得它现在有点开放性。即使Java是你的目标语言,它主要是一个算法相关的问题。请研究我的答案,虽然在你更新你的问题后,实现可能不适合你的描述,但搜索方法仍然是一个很好的选择应用。您可以通过添加优先级来计算分数,并找出哪个输入的分数最低。(例如,A1=-1,A2=4,A3=3,A4=2)Hi Solomon Tam..我尝试了您提到的方法,但在我的情况下不起作用,因为我不能用test1附加test2意味着我无法搜索“test1test2”.我需要单独检查,所以我尝试了包含检查,但问题是我无法在其中附加下一个参数。嗨..有人能帮我吗?
    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]