Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否可以为HashMap集创建队列?_Java_Data Structures_Collections_Queue_Hashmap - Fatal编程技术网

Java 是否可以为HashMap集创建队列?

Java 是否可以为HashMap集创建队列?,java,data-structures,collections,queue,hashmap,Java,Data Structures,Collections,Queue,Hashmap,现在我正在尝试创建一个生产者/消费者线程,生产者线程遍历所有可能的字母组合并创建它们各自的MD5哈希。然后将每个组合及其散列放入HashMap。现在,在我的消费者线程中,我希望能够使用hashmap上的队列集合,这样我的消费者线程就可以调用poll()等,这样就可以像队列那样删除值,但在调用poll()时,仍然可以看到组合及其散列我该怎么做?我有HashMap,但不知道如何“生成”或将其转换为队列。 谢谢。类型类似于HashMap和队列的组合-它存储键/值对,但也记住它们插入的顺序。这可能正是你

现在我正在尝试创建一个生产者/消费者线程,生产者线程遍历所有可能的字母组合并创建它们各自的MD5哈希。然后将每个组合及其散列放入
HashMap
。现在,在我的消费者线程中,我希望能够使用hashmap上的
队列
集合,这样我的消费者线程就可以调用
poll()
等,这样就可以像
队列
那样删除值,但在调用
poll()时,仍然可以看到组合及其散列
我该怎么做?我有
HashMap
,但不知道如何“生成”或将其转换为队列。 谢谢。

类型类似于
HashMap
队列
的组合-它存储键/值对,但也记住它们插入的顺序。这可能正是你要找的类型。没有显式的
poll()
函数,但是如果在
LinkedHashMap
上获得迭代器,则将按照元素添加的顺序访问元素。然后您可能会编写如下函数:

public <KeyType, ValueType> KeyType first(LinkedHashMap<KeyType, ValueType> map) {
    assert !map.isEmpty();
    return map.iterator().next();
}
while (someCondition) {
    Map.Entry nextEntry = null;

    // This block is equivalent to polling
    {
         synchronized(s) {
             Iterator i = s.iterator(); // Must be in the synchronized block
             if (i.hasNext()) {
                 nextEntry  = i.next();
                 i.remove();
             }
         }
    }

    if (nextEntry != null) {
         // Process the entry
         ...
    } else {
         // Sleep for some time
         ...
    }
    // process
}
公钥类型优先(LinkedHashMap){
assert!map.isEmpty();
返回map.iterator().next();
}
这将返回第一个元素。只需确保适当地同步

可选地,您可以考虑通过定义一个帮助类<代码> >对/<代码>,在一个<代码>队列中存储密钥/值对,然后在队列中存储<代码>配对< /代码> s。


希望这有帮助

我建议您创建一个EntrySet队列-

Queue<EntrySet<String,String>> queue = new SynchronousQueue<EntrySet<String,String>>();
for (EntrySet<String,String> entry:map.entrySet()) {
   queue.add(entry);
}
Queue Queue=new SynchronousQueue();
for(EntrySet条目:map.EntrySet()){
添加(条目);
}

您可以考虑使用另一种类型的队列,它允许您放置元素,只有PrDuuple在非空的情况下等待。BR>


如果需要,生产者将能够基于EntrySet对象重新组合映射。

如果不处理代码的线程安全性,则不应使用HashMap。否则,您可能会以活动锁结束

为了能够按照插入键的顺序迭代映射,可以使用LinkedHashMap

Map m = Collections.synchronizedMap(new LinkedHashMap(...));
制作人会推出这样的作品(没什么特别的):

消费者会对如下条目进行投票:

public <KeyType, ValueType> KeyType first(LinkedHashMap<KeyType, ValueType> map) {
    assert !map.isEmpty();
    return map.iterator().next();
}
while (someCondition) {
    Map.Entry nextEntry = null;

    // This block is equivalent to polling
    {
         synchronized(s) {
             Iterator i = s.iterator(); // Must be in the synchronized block
             if (i.hasNext()) {
                 nextEntry  = i.next();
                 i.remove();
             }
         }
    }

    if (nextEntry != null) {
         // Process the entry
         ...
    } else {
         // Sleep for some time
         ...
    }
    // process
}

很好,所以他只需要一些SyncObject就可以在消费者端读取LinkedHashMap时发出信号。嗨,LinkedHashMap不是线程安全的,也不是队列类型。@sperumal-我从来没有暗示过这两种情况都是这样。我假设OP将提供同步代码。此外,我不认为有任何要求它必须是
队列类型
;OP的问题从来没有提到这一点。如果这是一个要求,那么这种方法肯定不会起作用。谢谢你,这看起来确实是一个完美的解决方案,但是我还需要做些什么来保证线程安全呢?向LinkedHashMap添加volatile修饰符就足够了吗?@DavidKroukamp-有很多方法可以做到这一点,但是添加
volatile
不会做到这一点。您需要同步访问
LinkedHashMap
;可能是通过显式地在上面同步,或者可能是通过使用类似于
信号量的东西。谢谢你,我试试看。有一个问题是这是线程安全的吗?谢谢,这很有魅力,而且实现起来很快、很容易、很清晰