Java 设置<;整数>;内部地图

Java 设置<;整数>;内部地图,java,Java,我有个问题。首先,我宣布了一张地图: Map<TwoIntClass, Set<Integer>> m = new HashMap<TwoIntClass, Set<Integer>>(); 我的问题是,如何将变量num放入集合中。 谢谢。您必须先创建集合,添加项目,然后将集合放入地图中。在Java中没有很好的方法来初始化内联集合。(当Java7问世时,这一点可能会改变。) int num=7; Set=newhashset(); set.add

我有个问题。首先,我宣布了一张地图:

Map<TwoIntClass, Set<Integer>> m = new HashMap<TwoIntClass, Set<Integer>>();
我的问题是,如何将变量num放入集合中。
谢谢。

您必须先创建集合,添加项目,然后将集合放入地图中。在Java中没有很好的方法来初始化内联集合。(当Java7问世时,这一点可能会改变。)

int num=7;
Set=newhashset();
set.add(num);
m、 put(新的TwoIntClass(5,3),套装);
稍微好一点(来自):

可以按如下方式修改集合:

m.get(new TwoIntClass(5, 3)).add(6);

在执行任何操作之前,必须确保相关的
集合已实例化并插入到
映射中。你可以用像这样的东西

int num = 7;
m.put(new TwoIntClass(5, 3), ?? how to put num inside Set ??);
public void safeInsert(TwoIntClass tic, Integer element)
{
  if (!map.contains(tic))
    map.put(tic, new HashSet<Integer>());

  map.get(tic).add(element);
}
int num=7;
TwoIntClass twoInts=新的TwoIntClass(5,3);
m、 put(twoint,newhashset());
m、 获取(两个整数),添加(num);

每次您想在集合中放入某些内容时,都需要检查集合是否已存在,如果不存在,则创建集合。即:


int num = 7;
TwoIntClass twoInt = new TwoIntClass(5, 3);
Set<Integer> intSet = m.get(twoInt);
if(num == null) {
  intSet = new HashSet<Integer>();
  intSet.put(twoInt, intSet);
}
intSet.add(num);

int num=7;
TwoIntClass twoInt=新的TwoIntClass(5,3);
Set intSet=m.get(twoInt);
如果(num==null){
intSet=newhashset();
put(twoInt,intSet);
}
intSet.add(num);
在谷歌的番石榴库中有一个完美的抽象,你应该考虑使用,特别是如果这是你的代码中的重复模式。这使您不必考虑自己创建集合

SetMultimap<TwoIntClass, Integer> multimap = HashMultimap.create();
TwoIntClass twoInts = new TwoIntClass(5, 3);
int num = 7;
multimap.put(twoInts, num);

Set<Integer> set = multimap.get(twoInts); // set contains 7

multimap.put(twoInts, 8);
multimap.put(twoInts, 9); // set now contains 7, 8 and 9
SetMultimap multimap=HashMultimap.create();
TwoIntClass twoInts=新的TwoIntClass(5,3);
int num=7;
multimap.put(两个整数,num);
Set=multimap.get(两个整数);//一套7个
多重映射put(两个整数,8);
multimap.put(两个整数,9);//集合现在包含7、8和9
像其他人建议的那样,您需要实例化
接口的一个具体实例(像
哈希集
),在
中添加
int
值,然后将
放入
映射中。但是,如果您对
Map
的键使用自定义类,我建议您实现
TwoIntClass
类的
equals()
hashCode()
方法,以确保在
Map
中没有创建重复的条目。例如,考虑这个类:

public class TwoIntClass {

    private int i1;
    private int i2;

    public TwoIntClass(int i1, int i2) {
        this.i1 = i1;
        this.i2 = i2;   
    }

    static public void main(String...args) {

        Map<TwoIntClass, Set<Integer>> map = new HashMap<TwoIntClass, Set<Integer>>();

        Set<Integer> dataset = new HashSet<Integer>();
        dataset.add(1);
        dataset.add(2);

        TwoIntClass i1 = new TwoIntClass(5, 3);
        TwoIntClass i2 = new TwoIntClass(5, 3);

        map.put(i1, dataset);
        map.put(i2, dataset);

        System.out.println( i1.hashCode() + " = " + i2.hashCode() + " == " + i2.equals(i2) + " > map count = " + map.size() );

        TwoIntClass i3 = new TwoIntClass(5, 3);
        System.out.println("Looking for TwoIntClass(5,3)... " + map.containsKey(i3) );

    }
}
产生一个更预期的结果

1476323071=1476323071==true>映射计数=1

寻找TwoIntClass(5,3)。。。真的


当然,这个
hashCode()
方法过于简单,您可能需要找到一个更简单的方法,但底线是实现它们是我的建议。

但是如果我想按照m.put(新的TwoIntClass(5,3),?如何将num放入集合中??)做什么;改变数值;m、 put(新的TwoIntClass(5,3),?如何在集合中放入num;改变数值;m、 put(新的TwoIntClass(5,3),?如何在集合中放入num;这听起来太复杂了…最后一段代码将生成一个NullPointerException,请参见我的comment@YanickRochon:当你不知道
TwoIntClass
没有正确的
equals
hashCode
时,你不能说它“将生成一个NullPointerException”。这个例子显然假设它是,这是完全合理的。@ColinD。。。尽管值得一提,但为什么您认为他的
TwoIntClass
没有正确的
equals
hashCode
实现?当然,如果没有这一点,map将无法正常工作,但他没有询问这一点,也没有为key类提供代码,所以我不会认为他错了。您的
hashCode
方法似乎也有点奇怪,因为它没有遵循我见过的简单类的hash代码的一般模式。该代码只是一个概念证明。我假设TwoIntClass没有因为问题本身的性质而重写这样的方法。我可能错了,OP可能已经实现了这些方法,但是没有人注意到这个事实,这真的值得一提。谢谢你的透彻解释。这非常有帮助。如果您在多线程环境中工作,SafeSert只有在同步或类似的情况下才是安全的。(同步块等)否则存在用另一个替换现有集并丢失其中存储的值的风险。没有人说过多线程环境:)在这种情况下,存在实用工具
公共静态集synchronizedSet(集s)
可用于建立同步集,并
公共静态地图同步地图(地图m)
用于外部地图
map.computeIfAbsent(tic, k -> new HashSet<>()).add(element);
int num = 7;
TwoIntClass twoInts = new TwoIntClass(5, 3);
m.put(twoInts, new HashSet<Integer>());
m.get(twoInts).add(num);

int num = 7;
TwoIntClass twoInt = new TwoIntClass(5, 3);
Set<Integer> intSet = m.get(twoInt);
if(num == null) {
  intSet = new HashSet<Integer>();
  intSet.put(twoInt, intSet);
}
intSet.add(num);
SetMultimap<TwoIntClass, Integer> multimap = HashMultimap.create();
TwoIntClass twoInts = new TwoIntClass(5, 3);
int num = 7;
multimap.put(twoInts, num);

Set<Integer> set = multimap.get(twoInts); // set contains 7

multimap.put(twoInts, 8);
multimap.put(twoInts, 9); // set now contains 7, 8 and 9
public class TwoIntClass {

    private int i1;
    private int i2;

    public TwoIntClass(int i1, int i2) {
        this.i1 = i1;
        this.i2 = i2;   
    }

    static public void main(String...args) {

        Map<TwoIntClass, Set<Integer>> map = new HashMap<TwoIntClass, Set<Integer>>();

        Set<Integer> dataset = new HashSet<Integer>();
        dataset.add(1);
        dataset.add(2);

        TwoIntClass i1 = new TwoIntClass(5, 3);
        TwoIntClass i2 = new TwoIntClass(5, 3);

        map.put(i1, dataset);
        map.put(i2, dataset);

        System.out.println( i1.hashCode() + " = " + i2.hashCode() + " == " + i2.equals(i2) + " > map count = " + map.size() );

        TwoIntClass i3 = new TwoIntClass(5, 3);
        System.out.println("Looking for TwoIntClass(5,3)... " + map.containsKey(i3) );

    }
}
@Override
public boolean equals(Object obj) {
    if (!(obj instanceof TwoIntClass)) {
        return false;
    }
    TwoIntClass other = (TwoIntClass) obj;

    return (other.i1 == this.i1) && (other.i2 == this.i2); 
}

@Override
public int hashCode() {
    //return TwoIntClass.class.hashCode() | i1 | (i2 << 16);

    // better implementation based on the String class
    int hash = TwoIntClass.class.hashCode();

    hash = (hash * 31) + i1;
    hash = (hash * 31) + i2;

    return hash;
}