2016-10-20 264 views
1

我想在Java中實現以下想法:如果我將具有2個成員的類的一個對象映射爲布爾值,並使用相同的2個成員值創建另一個具有相同類的對象,則第二個對象應映射到與第一個相同的布爾值。在Java中映射對象

這是在C++代碼有希望地解釋了什麼是我想要做的事:

#include <iostream> 
#include <map> 

using namespace std; 


class A{ 
    int x; 
    int y; 

public: 
    A(int a, int b){ 
     x = a; 
     y = b; 
    } 
    bool operator < (const A &another) const{ 
     return x < another.x || y < another.y; 
    } 
}; 


int main() { 

    A a(1,2),b(1,2); 

    map <A,bool> exists; 

    exists[a]=true; 

    if(exists[b]){ 
     cout << "(1,2) exists" << endl; 
    } 
    else{ 
     cout << "(1,2) does not exist" << endl; 
    } 

    return 0; 
} 

輸出:

(1,2)存在

這裏一和b不是同一個對象,但它們具有相同的成員值。所以他們映射到相同的布爾值。

我一直在使用的HashMap在Java中實現這個沒有成功嘗試:

import java.util.*; 
import java.lang.*; 
import java.io.*; 

class Main 
{ 
    public static void main (String[] args) throws java.lang.Exception 
    { 
     A a = new A(1,2); 
     A b = new A(1,2); 

     Map <A,Boolean> exists = new HashMap<A,Boolean>(); 

     exists.put(a,true); 
     if(exists.containsKey(b)){ 
      System.out.println("(1,2) exists"); 
     } 
     else{ 
      System.out.println("(1,2) does not exist"); 
     } 
    } 
} 

class A{ 
    private int x; 
    private int y; 

    public A(int a, int b){ 
     x = a; 
     y = b; 
    } 
} 

輸出:

(1,2)不存在

我應該如何實現這在Java中?

回答

2

爲了有一個對象充當你需要重寫它的equals(Object)hashCode()方法HasMap的關鍵:

@Override 
public boolean equals(Object o) { 
    if (this == o) { 
     return true; 
    } 
    if (o == null || getClass() != o.getClass()) { 
     return false; 
    } 
    A a = (A) o; 
    return x == a.x && 
      y == a.y; 
} 

@Override 
public int hashCode() { 
    return Objects.hash(x, y); 
} 
+0

謝謝。你可以給我一些想法在數組的情況下做什麼? –

+0

我的意思是如何實現hashcode()。我得到了equals()部分。 –

+0

好的,讓我再次澄清。 –

1

你的類,A應在乘坐equalshashcode方法。

public class A { 
    private final int x; 
    private final int y; 

    public A(final int a, final int b) { 
     this.x = a; 
     this.y = b; 
    } 

    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + x; 
     result = prime * result + y; 
     return result; 
    } 


    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     A other = (A) obj; 
     if (x != other.x) 
      return false; 
     if (y != other.y) 
      return false; 
     return true; 
    } 

} 

class Main 
{ 
    public static void main (String[] args) throws java.lang.Exception 
    { 
     A a = new A(1,2); 
     A b = new A(1,2); 

     Map <A,Boolean> exists = new HashMap<A,Boolean>(); 

     exists.put(a,true); 
     if(exists.containsKey(b)){ 
      System.out.println("(1,2) exists"); 
     } 
     else{ 
      System.out.println("(1,2) does not exist"); 
     } 
    } 
}