如何从java哈希集检索对象

5vf7fwbs  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(279)

我正在寻找一种从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;
}
pkwftd7m

pkwftd7m1#

代码中的问题是,您在迭代过程中更改了hashset的结构它位于calculatemarginalgain()方法中,如下所示:

tmpAvailableNodes.removeAll(NeighborOfChurn);

再想一想这是否真的是对的!如果是,那么您可以通过首先为迭代创建集合的副本来轻松地解决问题。例如。:

Set<Customer> copy = new HashSet<Customer>;
copy.addAll(availableNodes);
for (Customer : copy) {
  ....
}

实际上tmpavailablenodes和availablenodes是相同的集合。也许你可以在这里做些改进。

wnavrhmk

wnavrhmk2#

你必须使用 Iterator :

Iterator<Customer> custIter = availableNodes.iterator();
while(custIter.hasNext()) {
    Customer customer = custIter.next();
    // do your work here
}

用这个你不会得到 ConcurrentModificationException . 但不清楚你为什么得到它。如果你在篡改 HashSet 从多个 Thread 我们可以考虑改用并发数据结构。
如果你修改 availableNodessetMarginalGain 但你还是会得到例外。

相关问题