Iam, создающий метод java, который задает строку ключевых слов, возвращает HashMap. Ключ к HashMap - это объект типа subXMLdoc, который я назвал docpart. Вещественная часть HashMap является массивом объектов Term_with_Pos. Мое намерение состоит в том, чтобы группировать все объекты Term_with_Pos под тем же объектом «docpart». Мой вопрос, почему в том, что, следующее логическое выражение всегда равно ИСТИНАHashMap.containKey возвращает неправильное значение
(ans.containsKey(docpart)== false)
SEE метод ниже:
public static void termProximity (String qry, HashMap<subXMLdoc,
ArrayList<Term_with_Pos>> ans
) throws SQLException
{
// convert the string of keywords (qry) into a list of terms (query)
ArrayList<Term_with_Pos> query = convertQuery(qry);
for (int i=0; i<query.size(); i++){
ResultSet rs = DbaseManager.displayFreqTb2 (con, query.get(i).getTerm());
while (rs.next()){
//create the xml element object.
//This will serve as the key to the HashMap
subXMLdoc docpart = new subXMLdoc ( rs.getString("docId"),
rs.getInt("eTypeId") ,
rs.getString("dewId")) ;
//create a term with position object
Term_with_Pos trm = new Term_with_Pos();
trm.setTerm(rs.getString("trm"));
// trm.setPosition(rs.getInt("pos"));
trm.setPosition(0);
if (ans.containsKey(docpart)==false){
ArrayList<Term_with_Pos> postings = new ArrayList<>();
postings.add(0,trm);
ans.put(docpart,postings);
} else{
ArrayList<Term_with_Pos> postings = ans.get(docpart);
int psize = postings.size();
postings.add(psize,trm);
ans.put(docpart,postings);
}
} // while
rs.close();
} // for
} // termProximity
Я уже переопределения равный метод, как показано в следующем классе.
public class subXMLdoc {
private String docId ;
private int elmTypeId;
private String dewId ;
public subXMLdoc (String dcId, int nodeId, String dew){
docId = dcId;
elmTypeId = nodeId ;
dewId = dew ;
}
public int getNodeId(){ return elmTypeId;}
public String getDew(){ return dewId;}
public String getDocId(){ return docId;}
@Override
public boolean equals(Object o){
if(!(o instanceof subXMLdoc))
return false;
subXMLdoc q = (subXMLdoc)o;
return (this.docId.equals(q.getDocId())
&& (this.elmTypeId == q.getNodeId()) && (this.dewId.equals(q.getDew())));
}//equals
}
Пожалуйста, помогите мне определить, почему и как решить проблему.
Для строки qry = "monica lewinsky". Метод возвращает следующую процедуру вывода две колонки: Первый столбец является ключом HashMap в то время как второй столбец значение часть HashMap
(3000, 11, 0.00.03.00.02.00) (monica, 0)
(1518000, 24, 0.00.03.02.00) (monica, 0)
(724000, 11, 0.00.03.00.13.00) (monica, 0)
(1360000, 11, 0.00.03.00.10.00) (monica, 0)
(3000, 11, 0.00.03.00.02.00) (lewinsky, 0)
(1294000, 28, 0.00.03.01.01) (monica, 0)
(420000, 24, 0.00.03.02.00) (monica, 0)
(976000, 28, 0.00.03.02.06) (monica, 0)
(1374000, 11, 0.00.03.00.31.00) (monica, 0)
(1360000, 12, 0.00.03.00.16.01) (monica, 0)
(1360000, 11, 0.00.03.00.16.00) (monica, 0)
Обратите внимание, что линии 1 и линии 5 имеют тот же ключ (3000, 11 , 0.00.03.00.02.00), т.е. docpart, и поэтому его необходимо объединить в единицу. Таким образом, выход предполагают, чтобы быть
(3000, 11, 0.00.03.00.02.00) (monica, 0), (lewinsky, 0)
(1518000, 24, 0.00.03.02.00) (monica, 0)
(724000, 11, 0.00.03.00.13.00) (monica, 0)
(1360000, 11, 0.00.03.00.10.00) (monica, 0)
(1294000, 28, 0.00.03.01.01) (monica, 0)
(420000, 24, 0.00.03.02.00) (monica, 0)
(976000, 28, 0.00.03.02.06) (monica, 0)
(1374000, 11, 0.00.03.00.31.00) (monica, 0)
(1360000, 12, 0.00.03.00.16.01) (monica, 0)
(1360000, 11, 0.00.03.00.16.00) (monica, 0)
'HashMap' работает с' hashCode' объекта, вы нарушили контракт 'equals' /' hashCode'. – MadProgrammer