Java 如何根据优先级搜索具有最大匹配条件的元素
e、 g我有四个具有相关元素的对象: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。 所以规则是精确匹配或更少匹配,但元素不应该
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”
[wz]
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]