Я реализовал алгоритм Apriori. он работает очень хорошо, но у меня возникла странная проблема: я определил класс Rule для поддержания сгенерированных правил.custom equals() метод не работает должным образом
Здесь:
public class Rule
{
private Set<Integer> left;
private Set<Integer> right;
private LookupArtist lookupArtist;
public Rule(LookupArtist lookupArtist){
left = new HashSet<>();
right = new HashSet<>();
this.lookupArtist = lookupArtist;
}
@Override
public boolean equals(Object another){
Rule rule = (Rule) another;
if(this.left.equals(rule.getLeft()) && this.right.equals(rule.getRight()))
return true;
else
return false;
}
@Override
public String toString(){
/* print the object */
}
public void addToLeft(Integer toAdd){
left.add(toAdd);
}
public void addToRight(Integer toAdd){
right.add(toAdd);
}
public Set<Integer> getLeft(){
return left;
}
public Set<Integer> getRight(){
return right;
}
}
Я также реализован метод equals()
по-другому, просто чтобы попробовать:
@Override
public boolean equals(Object another){
Rule rule = (Rule) another;
boolean flag = true;
for(Integer artist : left){
if(flag)
if(!rule.left.contains(artist))
flag=false;
}
if(flag)
for(Integer artist : right){
if(flag)
if(!rule.right.contains(artist))
flag=false;
}
return flag;
}
Объект LookupArtist используется для отображения чисел в некоторых строк.
Проблема в том, что когда я распечатываю правила, я обнаружил, что некоторые правила появляются два раза. Я также нашел в режиме отладки некоторые реплицированные правила, поэтому это не проблема печати. Правила сохраняются на карте:
static Map<Rule, Float> rules;
.
.
.
Rule rule = new Rule(lookupArtist);
for(int j=0;j<i;j++){
rule.addToLeft(a[j]);
}
for(int j=i;j<a.length;j++){
rule.addToRight(a[j]);
}
if(!rules.containsKey(rule)){
rules.put(rule, getRuleConfidence(rule));
}
Любая идея, где проблема может быть?
большое спасибо. не знал об этом :) –
Добро пожаловать. – aioobe