Java8: 如何在 Hashmap 中使用 Pair
Java8: How can I use Pair in Hashmap
我对 Java 完全陌生:
我正在尝试在 Java 8 中创建一个 HashMap:其中键是 class 状态的对象,值是(字符串,状态)的元组。
我在网上搜索了 Java 中的元组,我发现这个名为 Pair 的 class 看起来像一个二进制元组(我在这里阅读 :https://docs.oracle.com/javase/8/javafx/api/javafx/util/Pair.html and here : https://www.techiedelight.com/five-alternatives-pair-class-java/ ) - 但我很困惑,因为我还阅读了 post 在 Whosebug 中说 Java8.
中没有对
我写了这一行:
HashMap<State, Pair<String, State>> visited = new HashMap<>();
我导入了:
import java.util.*;
javafx.util.Pair
我收到如下错误消息:
javafx could not be resolved
Pair cannot be resolved to a type
我怎样才能做到我在 Java 8 中描述的事情?
我会给你建议,尝试创建你自己的 Pair class 实现,这很简单:
public class Pair<K, V> {
private final K first;
private final V second;
public Pair(final K first, final V second) {
this.first = first;
this.second = second;
}
public static <K, V> Pair<K, V> of(K first, V second) {
return new Pair<>(first, second);
}
public K getFirst() {
return first;
}
public V getSecond() {
return second;
}
}
在您的实现中,您可以声明任何构造函数、静态初始化方法或反序列化规则。比JavaFX Pair更舒服
- 对于元组的使用,有一个很棒的库 JOOL。
- 如果要使用自定义对象作为哈希映射键,请不要伪造为此 class.
正确定义 equals()
和 hashCode()
tl;博士
record Pair ( String string , State state ) {}
记录
is good if you want a general mutable pair class. Alternatively, you can whip up a specific immutable pairing quite easily in Java 16+ by using the records 功能。
记录是编写 class 的一种简短方式,其主要目的是透明且不可变地传递数据。您只需声明每个成员字段的类型和名称。编译器隐式创建构造函数、getter、equals
& hashCode
和 toString
.
这是我们完整的 class 六个词定义:
record Pair ( String string , State state ) {}
您当然会使用更具描述性的 class 和字段名称。
像常规实例一样实例化class。
Pair p = new Pair( "whatever" , tennessee ) ;
您可以在本地声明记录,也可以嵌套或单独声明记录。
上面的record
相当于下面看到的常规代码。现代 IDEs such IntelliJ 可以将记录转换为常规 class,创建此源代码。
package work.basil.example;
import java.util.Objects;
public final class Pair {
private final String string;
private final State state;
public Pair ( String string , State state ) {
this.string = string;
this.state = state;
}
public String string () { return string; }
public State state () { return state; }
@Override
public boolean equals ( Object obj ) {
if ( obj == this ) return true;
if ( obj == null || obj.getClass () != this.getClass () ) return false;
var that = ( Pair ) obj;
return Objects.equals ( this.string , that.string ) &&
Objects.equals ( this.state , that.state );
}
@Override
public int hashCode () {
return Objects.hash ( string , state );
}
@Override
public String toString () {
return "Pair[" +
"string=" + string + ", " +
"state=" + state + ']';
}
}
更新:根据这里的一些建议,我尝试使用 hashmap 实现配对,你能发现这段代码有什么问题吗?
我将此代码包含在 class "my_struct"
中
public class tuple<Character, my_struct> extends HashMap<Character, my_struct> {
public tuple() {
super();
}
public Character getMove(HashMap<Character, my_struct> c) {
Set<Character> w = c.keySet();
Character move;
for(Character i : w) {
move = i;
}
return move;
}
public my_struct getPrev(HashMap<Character, my_struct> c) {
Collection<my_struct> w = c.values();
my_struct prev;
for(my_struct i : w) {
prev = i;
}
return prev;
}
}
然后我尝试使用 HashMap class 中的 get() 方法和
我的新方法,但它不起作用:
HashMap i = new tuple();
我对 Java 完全陌生:
我正在尝试在 Java 8 中创建一个 HashMap:其中键是 class 状态的对象,值是(字符串,状态)的元组。
我在网上搜索了 Java 中的元组,我发现这个名为 Pair 的 class 看起来像一个二进制元组(我在这里阅读 :https://docs.oracle.com/javase/8/javafx/api/javafx/util/Pair.html and here : https://www.techiedelight.com/five-alternatives-pair-class-java/ ) - 但我很困惑,因为我还阅读了 post 在 Whosebug 中说 Java8.
中没有对
我写了这一行:
HashMap<State, Pair<String, State>> visited = new HashMap<>();
我导入了:
import java.util.*;
javafx.util.Pair
我收到如下错误消息:
javafx could not be resolved
Pair cannot be resolved to a type
我怎样才能做到我在 Java 8 中描述的事情?
我会给你建议,尝试创建你自己的 Pair class 实现,这很简单:
public class Pair<K, V> {
private final K first;
private final V second;
public Pair(final K first, final V second) {
this.first = first;
this.second = second;
}
public static <K, V> Pair<K, V> of(K first, V second) {
return new Pair<>(first, second);
}
public K getFirst() {
return first;
}
public V getSecond() {
return second;
}
}
在您的实现中,您可以声明任何构造函数、静态初始化方法或反序列化规则。比JavaFX Pair更舒服
- 对于元组的使用,有一个很棒的库 JOOL。
- 如果要使用自定义对象作为哈希映射键,请不要伪造为此 class. 正确定义
equals()
和 hashCode()
tl;博士
record Pair ( String string , State state ) {}
记录
记录是编写 class 的一种简短方式,其主要目的是透明且不可变地传递数据。您只需声明每个成员字段的类型和名称。编译器隐式创建构造函数、getter、equals
& hashCode
和 toString
.
这是我们完整的 class 六个词定义:
record Pair ( String string , State state ) {}
您当然会使用更具描述性的 class 和字段名称。
像常规实例一样实例化class。
Pair p = new Pair( "whatever" , tennessee ) ;
您可以在本地声明记录,也可以嵌套或单独声明记录。
上面的record
相当于下面看到的常规代码。现代 IDEs such IntelliJ 可以将记录转换为常规 class,创建此源代码。
package work.basil.example;
import java.util.Objects;
public final class Pair {
private final String string;
private final State state;
public Pair ( String string , State state ) {
this.string = string;
this.state = state;
}
public String string () { return string; }
public State state () { return state; }
@Override
public boolean equals ( Object obj ) {
if ( obj == this ) return true;
if ( obj == null || obj.getClass () != this.getClass () ) return false;
var that = ( Pair ) obj;
return Objects.equals ( this.string , that.string ) &&
Objects.equals ( this.state , that.state );
}
@Override
public int hashCode () {
return Objects.hash ( string , state );
}
@Override
public String toString () {
return "Pair[" +
"string=" + string + ", " +
"state=" + state + ']';
}
}
更新:根据这里的一些建议,我尝试使用 hashmap 实现配对,你能发现这段代码有什么问题吗?
我将此代码包含在 class "my_struct"
public class tuple<Character, my_struct> extends HashMap<Character, my_struct> {
public tuple() {
super();
}
public Character getMove(HashMap<Character, my_struct> c) {
Set<Character> w = c.keySet();
Character move;
for(Character i : w) {
move = i;
}
return move;
}
public my_struct getPrev(HashMap<Character, my_struct> c) {
Collection<my_struct> w = c.values();
my_struct prev;
for(my_struct i : w) {
prev = i;
}
return prev;
}
}
然后我尝试使用 HashMap class 中的 get() 方法和 我的新方法,但它不起作用:
HashMap