开发者

Is it possible to define as a List the key of a Map at Java?

开发者 https://www.devze.com 2023-02-28 20:19 出处:网络
I want to use HashMap or any Map for my purpose. I want to define the key of an element of my Map variable as:

I want to use HashMap or any Map for my purpose. I want to define the key of an element of my Map variable as:

<Intege开发者_开发技巧r, Integer>

Is it possible at Java?


Map<List<Integer>, SomethingElse> aMap =
    new HashMap<List<Integer>, SomethingElse>();


You will need to write a class to serve as key to your map. The new class would hold your two integers. Make sure to implement equals() and hashCode() methods.


Probably not the best solution, but you could use Pair(in worth case Point). Check this thread What is the equivalent of the C++ Pair<L,R> in Java?


That's not the way to do this. What I would do is to create some kind of wrapper class that stores two integers, and then instantiate this class as the key of each map entry.


Yes, List can be key

Yes, you can use a List as the key to your map.

Caveat: If using a Map implementation that depends on the result of Object::hashCode to track the keys, then you must be sure your List always returns the same hash code value. For a List, that means all the objects in the list must return the same hash code value, and you cannot be adding or removing objects in the list.

As you can see in the following chart, IdentityHashMap and EnumMap are two implementations that do not rely on Object::hashCode.

Is it possible to define as a List the key of a Map at Java?

Define a class for key

Alternatively, create a class to hold your pair of Integer objects.

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 +
                " }";
    }
}

Use instances of IntegerPair as your key to a map.

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" );

Dump to console.

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

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

0

精彩评论

暂无评论...
验证码 换一张
取 消