我正在寻找一种从java中的hashset中检索对象的方法。我对它的元素做了如下迭代:
for (Customer remainingNode : availableNodes) {
remainingNode.setMarginalGain(calculateMarginalGain(
remainingNode, seedSet, network, availableNodes,
churnNet));
}
不幸的是,由于并发修改异常,我必须将其更改为以下内容:
for(int i=0;i<numberofRemainingNodes;i++){
Customer remainingNode=availableNodes.get(i);
remainingNode.setMarginalGain(calculateMarginalGain(
remainingNode, seedSet, network, availableNodes,
churnNet));
numberofRemainingNodes=availableNodes.size();
}
但我不能这样做,因为没有任何用于javahashset的get(index)方法。你能帮我处理一下这种情况吗?
p、 s:我使用hashset是因为我想处理并集和交集的情况,并且我不想向其中添加重复的元素。请考虑我的程序的这一部分应该运行数百万次,所以对于整个程序来说,额外的延迟可能是昂贵的。
仅供参考:
private int calculateMarginalGain(Customer remainingNode,
HashSet<Customer> seedSet,
DirectedSparseGraph<Customer, Transaction> net,
Set<Customer> availableNodes, HashSet<Customer> churnNetwork) {
// Marginal gain for short-term campaign
HashSet<Customer> tmp = new HashSet<Customer>(); // seedset U
// {remainingNode}
tmp.add(remainingNode);
Set<Customer> tmpAvailableNodes = availableNodes;
HashSet<Customer> NeighborOfChurn = getNeighbors(churnNetwork, net);
// sigma function for calculating the expected number of influenced
// customers- seedSettmp=seedset U {u}
tmpAvailableNodes.removeAll(NeighborOfChurn);
Set<Customer> influencedNet = getNeighbors(tmp, net);
tmpAvailableNodes.retainAll(influencedNet);
return tmpAvailableNodes.size();
}
private HashSet<Customer> getNeighbors(HashSet<Customer> churnNetwork,
DirectedSparseGraph<Customer, Transaction> net) {
HashSet<Customer> churnNeighbors = churnNetwork;
Collection<Customer> neighbors = new HashSet<Customer>();
for (Customer node : churnNetwork) {
neighbors = net.getNeighbors(node);
for (Customer neighbor : neighbors) {
churnNeighbors.add(neighbor);
}
}
return churnNeighbors;
}
2条答案
按热度按时间pkwftd7m1#
代码中的问题是,您在迭代过程中更改了hashset的结构它位于calculatemarginalgain()方法中,如下所示:
再想一想这是否真的是对的!如果是,那么您可以通过首先为迭代创建集合的副本来轻松地解决问题。例如。:
实际上tmpavailablenodes和availablenodes是相同的集合。也许你可以在这里做些改进。
wnavrhmk2#
你必须使用
Iterator
:用这个你不会得到
ConcurrentModificationException
. 但不清楚你为什么得到它。如果你在篡改HashSet
从多个Thread
我们可以考虑改用并发数据结构。如果你修改
availableNodes
在setMarginalGain
但你还是会得到例外。