【问题标题】:Is it possible to define as a List the key of a Map at Java?是否可以在 Java 中将 Map 的键定义为 List ?
【发布时间】:2011-04-23 16:31:54
【问题描述】:

我想使用 HashMap 或任何 Map 来实现我的目的。我想将我的 Map 变量元素的 key 定义为:

<Integer, Integer>

Java 有可能吗?

【问题讨论】:

  • 请解释一下,为什么你想这样做?
  • 我将为一对整数推送一个值,即键是 1,2,值是 5,键是 1,3,值是 6,依此类推。
  • 您要定义 Map,Integer> 吗?还是您想使用 Map 作为元组列表?你的问题不清楚
  • 我想将我的键定义为 List 所以我的 Map 将是 Map,Integer>

标签: java map hashmap


【解决方案1】:
Map<List<Integer>, SomethingElse> aMap =
    new HashMap<List<Integer>, SomethingElse>();

【讨论】:

    【解决方案2】:

    您需要编写一个类作为地图的键。新类将保存您的两个整数。确保实现 equals() 和 hashCode() 方法。

    【讨论】:

      【解决方案3】:

      可能不是最好的解决方案,但您可以使用 Pair(在值得的情况下使用 Point)。检查此线程What is the equivalent of the C++ Pair<L,R> in Java?

      【讨论】:

        【解决方案4】:

        这不是这样做的方法。我要做的是创建某种包装类来存储两个整数,然后将该类实例化为每个映射条目的键。

        【讨论】:

          【解决方案5】:

          是的,List 可以是关键

          是的,您可以使用 List 作为地图的键。

          警告:如果使用依赖于Object::hashCode 的结果的Map 实现来跟踪密钥,那么您必须确保您的List 总是 返回相同的哈希值代码值。对于List,这意味着列表中的所有对象都必须返回相同的哈希码值,并且您不能在列表中添加或删除对象。

          如下图所示,IdentityHashMapEnumMap 是两个不依赖于Object::hashCode 的实现。

          为键定义一个类

          或者,创建一个类来保存您的一对 Integer 对象。

          package work.basil.example;
          
          import java.util.Objects;
          
          public class IntegerPair
          {
              public Integer first, second;
          
              public IntegerPair ( Integer first , Integer second )
              {
                  this.first = Objects.requireNonNull( first );
                  this.second = Objects.requireNonNull( second );
              }
          
              @Override
              public boolean equals ( Object o )
              {
                  if ( this == o ) return true;
                  if ( o == null || getClass() != o.getClass() ) return false;
                  IntegerPair that = ( IntegerPair ) o;
                  return first.equals( that.first ) &&
                          second.equals( that.second );
              }
          
              @Override
              public int hashCode ( )
              {
                  return Objects.hash( first , second );
              }
          
              @Override
              public String toString ( )
              {
                  return "IntegerPair{ " +
                          "first=" + first +
                          " | second=" + second +
                          " }";
              }
          }
          

          使用IntegerPair 的实例作为地图的键。

          Map < IntegerPair, String > pairToString = new HashMap <>( 3 );
          pairToString.put( new IntegerPair( 10 , 11 ) , "Ones" );
          pairToString.put( new IntegerPair( 20 , 21 ) , "Twos" );
          pairToString.put( new IntegerPair( 30 , 31 ) , "Threes" );
          

          转储到控制台。

          System.out.println( "pairToString.toString(): " + pairToString );
          

          pairToString.toString(): {IntegerPair{ first=10 | second=11 }=Ones, IntegerPair{ first=20 | second=21 }=Twos, IntegerPair{ first=30 |秒=31 }=三个}

          【讨论】:

            猜你喜欢
            • 2012-04-04
            • 1970-01-01
            • 1970-01-01
            • 2021-02-23
            • 1970-01-01
            • 2017-06-04
            • 1970-01-01
            • 2020-12-18
            • 1970-01-01
            相关资源
            最近更新 更多