- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个java方法,给定一串关键字将返回一个HashMap。HashMap 的关键是一个 subXMLdoc 类型的对象,我将其称为 docpart。HashMap 的值部分是 Term_with_Pos 对象的数组列表。我的意图是将所有 Term_with_Pos 对象分组到同一“docpart”对象下。我的问题是为什么会这样以下 boolean 表达式始终等于 TRUE
(ans.containsKey(docpart)== false)
请参阅以下方法:
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
我已经重写了 equal 方法,如下面的类所示。
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的key,第二列是HashMap的value部分
(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)
最佳答案
您声明:
I have already override the equal method as shown in the following class.
您还需要重写hashCode
,尤其是对于 HashMap 的键。你在哪里做这个?
您的 hashCode 应该使用与 equals 使用相同的字段,并且约定是,如果两个对象相等,则它们的 hashCode必须 相同,但反之则不一定成立 - 两个对象具有相同的hashCode理论上不可能相等。
所以,如果这是你的平等者:
@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())) );
}
然后 hashCode 必须使用 docId、elmTypeIt 和 dewId 字段来计算其值。
<小时/>例如(我作弊了),但这就是 Eclipse 为我提供的 equals 和 hashCode,如果你仔细想想,这是有道理的:
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((dewId == null) ? 0 : dewId.hashCode());
result = prime * result + ((docId == null) ? 0 : docId.hashCode());
result = prime * result + elmTypeId;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
SubXmlDoc other = (SubXmlDoc) obj;
if (dewId == null) {
if (other.dewId != null)
return false;
} else if (!dewId.equals(other.dewId))
return false;
if (docId == null) {
if (other.docId != null)
return false;
} else if (!docId.equals(other.docId))
return false;
if (elmTypeId != other.elmTypeId)
return false;
return true;
}
<小时/>
顺便说一句,还请注意,您的代码应遵守 Java 命名约定,以避免欺骗其他人。类名应以大写字母开头,所有非常量名称应使用驼峰式大小写。所以你的类名应该是"SubXmlDoc"
。
关于java - HashMap.containsKey 返回错误值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26749924/
我有不同的结构,它们都包含一个 HashMap与 String作为键,但具有不同的值类型。例如,一个结构有一个类型为 HashMap 的成员, 另一个将有一个 HashMap 类型的成员, 等等。 我
我想制作一个包含学生姓名和科目的板,每个学生在每个科目中都有一个成绩(或者没有..他可以离开考试而不写,然后他的案子将是空的)。我只想使用 HashMap。我的意思是,它会是这样的: HashMap>
是否有内存和速度高效的方法来在 HashMap 中动态存储唯一键:值对? key 保证是唯一的,但它们的数量经常变化。插入和删除必须很快。 我所做的是包含有符号距离场的八叉树(非线性/完整)。八叉树经
有谁知道为什么选择通过 LinkedList 而不是另一个 Hashmap 来实现 HashMap 的存储桶。如果桶本身变成了 HashMap,那么 contains 或 get 的时间复杂度似乎是
我想创建一个具有嵌套结构的 HashMap,就像这个复杂的示例: { type: boy name: Phineas father: type: man
这个问题在这里已经有了答案: How do I create a global, mutable singleton? (7 个答案) 关闭 7 年前。 我想要一个可扩展的字典,将 Object 与
HashMap> hm = new HashMap>(); hm.put("Title1","Key1"); for(int i=0;i hm1 = new H
我必须修改当前代码以适应 Spring MVC。我有 HashMap hashmap = new HashMap(); request.setAttribute("dslrErrors", hashm
我正在尝试进行一些错误捕获。 错误应该检查数组的长度是否小于 2,并检查 HashMap 是否包含用户输入的键。 捕获的错误必须仅使用 if 语句,并且必须使用 .length() 方法,并且必须使用
在 stackoverflow 上提出另一个问题后,(Java- Why this program not throwing concurrent Modification exception)我开始
我有两个类,想使用 org.dozer.Mapper( http://dozer.sourceforge.net/ ) 将 Female 对象的属性映射到 Male 对象。 第一类是: public
As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be
是否有任何方法可以检查 HashMap 是否包含一组特定的键(这些键是在数组中给出的)。当我尝试类似下面的代码时,它返回 false。 map.containsKey(arrayOf("2018-01
跟进我的问题:How To Access hash maps key when the key is an object 我想尝试这样的事情:webSearchHash.put(xfile.getPa
我有一个可扩展的 ListView ,对于每个 child ,我需要有 4 个“额外”或字符串或其他名称来调用它:- 子标题- 描述- 链接1- 链接2 跟着教程,创建 ListView 、不同的 p
我想确保这是正确的,因为如果不正确,它可能会破坏我的应用程序。 我有这个: private static HashMap> balance = new HashMap<>(); 如果我得到这样的值:
我想做以下事情: 为某个键查找Vec,并将其存储以备后用。 如果它不存在,则为键创建一个空的 Vec,但仍将其保存在变量中。 如何有效地做到这一点?自然地,我认为我可以使用 match: use st
我想做以下事情: 为某个键查找Vec,并将其存储以备后用。 如果它不存在,则为键创建一个空的 Vec,但仍将其保存在变量中。 如何有效地做到这一点?自然地,我认为我可以使用 match: use st
我想做以下事情: 为某个键查找Vec,并将其存储以备后用。 如果它不存在,则为键创建一个空的 Vec,但仍将其保存在变量中。 如何有效地做到这一点?自然地,我认为我可以使用 match: use st
我想做以下事情: 为某个键查找Vec,并将其存储以备后用。 如果它不存在,则为键创建一个空的 Vec,但仍将其保存在变量中。 如何有效地做到这一点?自然地,我认为我可以使用 match: use st
我是一名优秀的程序员,十分优秀!