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更舒服

  1. 对于元组的使用,有一个很棒的库 JOOL
  2. 如果要使用自定义对象作为哈希映射键,请不要伪造为此 class.
  3. 正确定义 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 & hashCodetoString.

这是我们完整的 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();