- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
所以,我用 3 个成员用 Java 制作了自己的组合键
public class MyOwnKey{
int location;
int length;
String [] tokens;
}
现在我使用构造函数创建两个对象
String [] tokens = "Stackoverflow is great".split("\\s+");
Object key1 = new MyOwnKey(0,0,tokens)
tokens = "Web is great".split("\\s+");
Object key2 = new MyOwnKey(0,0,tokens)
现在,我在 HashMap 中添加键HashMap map = new HashMap();map.put(key1,1);
问题来了当我确实包含 key 时,它会给出 false;
**map.containsKey(key2) //returns false whereas it should return true.**
只是为了让它有意义:
key1.equals(key2) returns true
和哈希码代码也相等。 key1.hashCode() == key2.hashCode().
我已经实现了我自己的 hashCode、toEquals() 和 toCompare() 版本。
不确定是什么问题。
这是代码
import java.io.DataOutput;
import java.io.DataInput;
import java.io.IOException;
import org.apache.hadoop.io.WritableComparable;
public class PatternGeneratorKey implements WritableComparable<Object> {
private String [] tokens;
int location;
int length;
StringBuffer _toString = null;
public PatternGeneratorKey(){
tokens = new String[1];
location =0;
length=1;
}
public PatternGeneratorKey(int location, int length, String [] tokens){
this.location = location;
this.length = length;
this.tokens= new String[tokens.length];
for(int i = 0; i < tokens.length;i++){
this.tokens[i] = tokens[i];
}
}
public int compareTo(Object o) {
if (!(o instanceof PatternGeneratorKey))
return -1;
return this.compareTo((PatternGeneratorKey) o);
}
public void write(DataOutput out) throws IOException {
out.writeInt(tokens.length);
for(int i = 0; i<tokens.length;i++){
out.writeUTF(tokens[i]);
}
out.writeInt(location);
out.writeInt(length);
}
public void readFields(DataInput in) throws IOException {
int l = in.readInt();
tokens = new String[l];
for(int i = 0; i < l ; i++){
tokens[i] = in.readUTF();
}
location = in.readInt();
length = in.readInt();
}
public int compareTo(PatternGeneratorKey k) {
if(this.tokens.length - this.length != k.tokens.length - k.length){
return this.tokens.length - this.length -( k.tokens.length - k.length);
}
if(this.location != k.location){
return this.location - k.location;
}
int i = 0 , j= 0;
for(i = 0, j=0 ; i < this.tokens.length && j < k.tokens.length;){
if(i == this.location ){
i = i + length;
continue;
}
if( j == k.location){
j = j + k.length;
continue;
}
if(!this.tokens[i].equalsIgnoreCase(k.tokens[j])){
return this.tokens[i].compareTo(k.tokens[j]);
}else{
i++;
j++;
}
}
//TODO: add comparison on left out phrase
return 0;
}
public int hashCode() {
int hashCode=0;
for(int i = 0; i < tokens.length;){
if(i == location ){
i = i + length;
continue;
}
hashCode += tokens[i++].hashCode();
}
hashCode+= location + tokens.length;
return hashCode;
}
public String toString(){
if(_toString == null){
_toString = new StringBuffer();
for(int k = 0; k < tokens.length ;k++){
if(k==location){
_toString.append(":").append(" ");
k=k+length-1;
}else{
_toString.append(tokens[k]).append(" ");
}
}
}
return _toString.toString();
}
public boolean equals(PatternGeneratorKey k) {
if(this.tokens.length - this.length == k.tokens.length - k.length
&& this.location == k.location){
//assume second one is larger
String tokens[] = k.tokens;
int length = k.length;
int location = k.location;
String [] tokens1 = this.tokens;
int length1 = this.length;
int location1 = this.location;
//make the local variable point to the largest of the two
if( this.tokens.length > k.tokens.length){
tokens = this.tokens;
length = this.length;
location = this.location;
tokens1 = k.tokens;
length1 = k.length;
location1 = k.location;
}
int i = 0 , j= 0;
for(i = 0, j=0 ; i < tokens.length;){
if(i == location ){
i = i + length;
continue;
}
// if( j >= location1 && j<= location1 + length1 -1){
if( j == location1){
j = j + length1;
continue;
}
if(!tokens[i++].equalsIgnoreCase(tokens1[j++])){
return false;
}
}
return true;
}else{
return false;
}
}
}
这是我正在测试的代码
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.hadoop.io.Text;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String value = "gm used cars";
// Compile all the words using regex
String[] tokens = value.toString().split("\\s+");
//to find pattern we need atleast two words in the query
if(tokens.length <=1){
return;
}
Map<PatternGeneratorKey,List> map = new HashMap<PatternGeneratorKey, List>();
for(int l = 1 ; l < tokens.length; l++){
for(int i = 0 ; i < tokens.length - (l-1); i++){
String hit = new String(getPhrase(l, i, tokens));
PatternGeneratorKey key1 = new PatternGeneratorKey(i, l, tokens);
List list = null;
for(int k = 0;k< tokens.length;k++){
System.out.println("i:" + i + ",l:" + l + ",tokens:" + tokens[k]);
}
System.out.println("hashcode:" + key1.hashCode());
if(!map.containsKey(key1)){
list = new ArrayList<String>();
map.put(key1, list);
}else{
list = (List) map.get(key1);
}
list.add(hit);
}
}
value = "ford used cars";
String[] tokens2= value.toString().split("\\s+");
PatternGeneratorKey key2 = new PatternGeneratorKey(0, 1, tokens);
//run a sliding window for length 1 to tokens length -1
for(int l = 1 ; l < tokens2.length; l++){
//genereate token pairs with sliding window.
for(int i = 0 ; i < tokens2.length - (l-1); i++){
//hit a single token or a + b if there are two.
String hit = new String(getPhrase(l, i, tokens2));
PatternGeneratorKey key1 = new PatternGeneratorKey(i, l, tokens2);
System.out.println();
System.out.println(key1.toString() + "|" + key2.toString() + "|"+ key1.equals(key2));
for(int k = 0;k< tokens2.length;k++){
System.out.println("i:" + i + ",l:" + l + ",tokens:" + tokens2[k]);
}
System.out.println("hashcode:" + key1.hashCode());
List list = null;
if(!map.containsKey(key1)){
list = new ArrayList<String>();
map.put(key1, list);
}else{
list = (List) map.get(key1);
}
list.add(hit);
}
}
value = "ford used cars";
tokens= value.toString().split("\\s+");
PatternGeneratorKey key1 = new PatternGeneratorKey(0,1,tokens);
tokens2 = "gm used cars".split("\\s+");
key2 = new PatternGeneratorKey(0,1,tokens2);
System.out.println(key1.equals(key2));
System.out.println(key2.equals(key1));
System.out.println(key1.hashCode() );
System.out.println(key2.hashCode() );
System.out.println(map);
}
private static String getPhrase(int l, int i, String[] tokens){
StringBuffer strin = new StringBuffer();
int index = 0;
for(index = i ; index < i+l;index++){
if(index < i+l-1){
strin.append(tokens[index]).append("+");
}
else
{
strin.append(tokens[index]);
}
}
return strin.toString();
}
}
最佳答案
您的问题是由 equals(PatternGeneratorKey)
引起的不会覆盖 equals(Object)
(但它重载了 equals(Object)
,因此当 key1.equals(key2)
和 true
是 key1
类型的变量时, key2
返回 PatternGeneratorKey
!)。
自 HashMap
电话 equals(Object)
要检查键是否相等,您的方法永远不会被调用,因此您需要实现 equals(Object)
相反。
关于java - 在复合对象的 HashMap 中找不到键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5808018/
我有不同的结构,它们都包含一个 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
我是一名优秀的程序员,十分优秀!