gpt4 book ai didi

java - Groovy 与 Java 中带有自定义键的映射

转载 作者:行者123 更新时间:2023-12-01 16:52:01 26 4
gpt4 key购买 nike

我想在 Groovy 中使用映射,其中键将是不可变类的实例。

这是我在 Java 中经常做的事情,它工作得很好,就像在这个示例类中一样:

public class TestMap {
static final class Point {
final int x; final int y;
public Point(int x, int y) {this.x = x;this.y = y;}
}

public static void main(String[] args) {
Map<Point, String> map = new HashMap<>();
final Point origin = new Point(0, 0);
map.put(origin, "hello world !" );
if(!map.containsKey(origin))
throw new RuntimeException("can't find key origin in the map");
if(!map.containsKey(new Point(0,0))) {
throw new RuntimeException("can't find new key(0,0) in the map");
}
}
}

但是当我尝试使用 Groovy 实现同样的目标时,它不起作用。为什么 ?以下是 Groovy 中的一个非工作示例:

class Point { 
final int x; final int y
Point(int x, int y) { this.x = x; this.y = y }
public String toString() { return "{x=$x, y=$y}" }
}

def origin = new Point(0, 0)
def map = [(origin): "hello"]
map[(new Point(1,1))] = "world"
map.put(new Point(2,2), "!")

assert map.containsKey(origin) // this works: when it's the same ref
assert map.containsKey(new Point(0,0))
assert map.containsKey(new Point(1,1))
assert map.containsKey(new Point(2,2))
assert !map.containsKey(new Point(3,3))

最佳答案

您的 Point 类需要有一个 equalshashCode 方法,以便可以在 Point 类中找到实例作为键> HashMap

您可以通过在 Groovy 中添加注释来快速完成此操作:

import groovy.transform.*

@EqualsAndHashCode
class Point {
final int x; final int y
Point(int x, int y) { this.x = x; this.y = y }
public String toString() { return "{x=$x, y=$y}" }
}

关于java - Groovy 与 Java 中带有自定义键的映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38266809/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com