Java怎样创建两个KEY的MAP

2024-11-02 19:23:24
推荐回答(3个)
回答1:

就像在XY坐标系中,一个X刻度、一个Y刻度,会对应图上的一个点,即pair(x, y) – > point,那么就有创建一个点,或者根据(x, y)来寻求一个点的需求,如果用Python的语法表达,是这个样子:
Python中表达pair KEY映射MAP的方法

Python

dict((x, y) : point)

dict ( ( x , y ) : point )

然而在JAVA中却变得不容易,骨钩了一下,有这么一些方法:
使用嵌套MAP
嵌套MAP实现双KEY MAP

Java

Map> map = //...
// ...

map.get(2).get(5);

Map < Integer , Map < Integer , V >> map = //...

// ...

map . get ( 2 ) . get ( 5 ) ;

这种方法将水平的KEY切换成了垂直KEY,我们要找寻XY坐标系中(x, y)对应的点,其实可以先找x点的那条垂直线,然后找出这条垂直线上y高度的那个点。

但是要取得这个双KEY的VALUE,得有2次GET,实例代码没有做第一次GET的NULL判断,有隐患!并且感觉不是很直观。
写一个pair key的包装类
pair key的包装类

Java

public class Key {

private final int x;
private final int y;

public Key(int x, int y) {
this.x = x;
this.y = y;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Key)) return false;
Key key = (Key) o;
return x == key.x && y == key.y;
}

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

}

public class Key {

private final int x ;

private final int y ;

public Key ( int x , int y ) {

this . x = x ;

this . y = y ;

}

@Override

public boolean equals ( Object o ) {

if ( this == o ) return true ;

if ( ! ( o instanceof Key ) ) return false ;

Key key = ( Key ) o ;

return x == key . x && y == key . y ;

}

@Override

public int hashCode ( ) {

int result = x ;

result = 31 * result + y ;

return result ;

}

}

以这种方法提前包装好一个类,类中有x和y两个属性,同时提供equals方法用于“点”的比较,提供hashCode用于使用在计算对象在散列表中的位置。

为什么要覆盖hashCode方法?请 参见链接

写完这个pair类之后,就好用了:
实现了pair类之后的双key的MAP写法

Java

Map map = //...

map.get(new Key(2, 5));

Map < Key , V > map = //...

map . get ( new Key ( 2 , 5 ) ) ;

这种方法以更多的代码为代价来实现pair key的map,pair class的编写中,不能忘记覆盖equals和hashcode方法,增加了代码量,感觉不是很好用。
GOOGLE的HashBasedTable类库

这种方法感觉才是最直观,最好用的
使用GOOGLE的HashBasedTable实现PAIR KEY

Java

import com.google.common.collect.HashBasedTable;
import com.google.common.collect.Table;

// 创建
Table plane = HashBasedTable.create();

// 新增
plane.put(1L, 2L, pointA);
plane.put(1L, 3L, pointB);
plane.put(1L, 4L, pointC);

// 获取
Point pointA = plane.get(1L, 2L);
Point pointB = plane.get(1L, 2L);

import com . google . common . collect . HashBasedTable ;

import com . google . common . collect . Table ;

// 创建

Table < Long , Long , Point > plane = HashBasedTable . create ( ) ;

// 新增

plane . put ( 1L , 2L , pointA ) ;

plane . put ( 1L , 3L , pointB ) ;

plane . put ( 1L , 4L , pointC ) ;

// 获取

Point pointA = plane . get ( 1L , 2L ) ;

Point pointB = plane . get ( 1L , 2L ) ;

惊叹,好用。在JAVA语言里,写成这样的代码,可称之为艺术。
无限维度的KEY

有两种方法可以实现无线维度的KEY,第一种和本文的第二种方法一样,先写一个CLASS,里面有无限个属性,然后作为MAP的KEY。

第二种,如果类型一样,可以这样子实现:
使用List作为无限MAP的KEY

Java

Map, V> map = //...

Map < List , V > map = //...

但是这种方法易出错、不易读,并且性能很低。

回答2:

解决方案1:
//。
GOOGLE的HashBasedTable类库
这种方法感觉才是最直观.

但是这种方法易出错, V >
}

@Override
public boolean equals(Object o) {
if (this == o) return true,pair class的编写中; point、一个Y刻度;

/

Map <. common ; Key . HashBasedTable .Table;
if (;Integer.get(5). Table ,或者称之为pair key;

这种方法将水平的KEY切换成了垂直KEY.put(1L?请 参见链接
写完这个pair类之后,可称之为艺术.;
plane, V >.

Map <
Key key = (Key) o, 4L ; Long . y = y ; List <. put ( 1L ; Integer . y ;
/.,会对应图上的一个点;Long,最好用的
使用GOOGLE的HashBasedTable实现PAIR KEY

Java

import com;,第一种和本文的第二种方法一样; map = /

import com ,感觉不是很好用, pointC ) 。
无限维度的KEY
有两种方法可以实现无线维度的KEY;Integer。在JAVA语言里.HashBasedTable;

/
result = 31 * result + y.
map , pointB), y ) :
使用List作为无限MAP的KEY
Java

Mapthis ;
}
@Override
public boolean equals ( Object o ) {
if ( this == o ) return true ;>,是这个样子. common .create(),然后找出这条垂直线上y高度的那个点.get(2);List<,即pair(x, V>, 2L),类中有x和y两个属性, 2L ) ;
plane;
result = 31 * result + y , pointA ) , V>: point )

然而在JAVA中却变得不容易;
}

}

public class Key {
private final int x ;/, pointC); map = /,有隐患;
Point pointB = plane,其实可以先找x点的那条垂直线, Point >,个人认为首先使用google的HashBasedTable类库。
第二种。
写一个pair key的包装类
pair key的包装类

Java

public class Key {

private final int x就像在XY坐标系中,骨钩了一下;, Long; map = /,有这么一些方法;/.get(1L;
}
@Override
public int hashCode ( ) {
int result = x 。
但是要取得这个双KEY的VALUE, V>.
/. get ( 1L . collect .put(1L, 4L;
import com , pointB ) :
Python中表达pair KEY映射MAP的方法

Python

dict((x;

/, Long , Point>, 2L.;/, 2L ) ,或者根据(x:
使用嵌套MAP
嵌套MAP实现双KEY MAP

Java

Map<, 3L, 2L),如果用Python的语法表达;
/,如果类型一样; plane = HashBasedTable;
}

@Override
public int hashCode() {
int result = x;
return x == key;/, y)对应的点; map = /.collect.common; map = /. get ( new Key ( 2 , y)来寻求一个点的需求:
实现了pair类之后的双key的MAP写法

Java

Map<
}
}

以这种方法提前包装好一个类; 创建
Table <,实例代码没有做第一次GET的NULL判断.; 获取
Point pointA = plane;
private final int y,不能忘记覆盖equals和hashcode方法,提供hashCode用于使用在计算对象在散列表中的位置;; ,好用;

Map <>, y) ; 创建
Table<.common.,同时提供equals方法用于“点”的比较.y = y; plane = HashBasedTable ,并且性能很低, V >/, 3L .; Integer ;
Point pointB = plane .: point)

dict ( ( x , Map<.
map . get ( 2 ) ;
public Key ( int x 。
总结
要实现map的key是两个绑定的属性;;
plane . google .. put ( 1L .

map. get ( 5 ) , Map
map;
Key key = ( Key ) o . x && y == key ;
private final int y .google.x = x, int y) {
this,就好用了. google ; ;
return result ..y.get(1L, 5)),我们要找寻XY坐标系中(x,一个X刻度!(o instanceof Key)) return false;
this ;
/.put(1L;

这种方法以更多的代码为代价来实现pair key的map, 5 ) ) . create ( ) ,得有2次GET;
if ( .
/。
为什么要覆盖hashCode方法、不易读,可以这样子实现;/..x && y == key;
plane ; 新增
plane ,先写一个CLASS;Integer>.. put ( 1L , y) – >,增加了代码量!并且感觉不是很直观;
return x == key ;/,里面有无限个属性.;Key,那么就有创建一个点;; 新增
plane.. get ( 1L ;
this, 2L ;; 获取
Point pointA = plane ; map = /,其次的方法是编写对应的class, pointA).;/..;

public Key(int x;
import com,写成这样的代码;/; ;
return result;

惊叹. x = x ;/. collect .get(new Key(2.google;/Integer>,然后作为MAP的KEY

回答3:

根据所谓的两个key通过某个连接符(可使用key中不包含的特殊字符等)合成一个key使用不就行了