首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Java ConcurrentMap -键在地图中的位置

Java ConcurrentMap -键在地图中的位置
EN

Stack Overflow用户
提问于 2012-04-26 06:31:04
回答 3查看 536关注 0票数 1

我有一个有趣的问题,我需要一些帮助。我为两个独立的条件实现了几个队列,一个基于先进先出,另一个基于键的自然顺序(ConcurrentMap)。也就是说,您可以想象两个队列都有相同的数据,只是排序不同而已。我的问题是(我正在寻找一种有效的方法来做这件事)如果我根据一些标准在ConcurrentMap中找到键,那么在FIFO映射中找到键的“位置”的最佳方法是什么。从本质上说,我想知道它是第一个键(这很容易),还是说它是第十个键。

任何帮助都将不胜感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-04-26 17:34:44

我相信像下面这样的代码就可以完成这项工作。我把element --> key的实现作为一个抽象方法。请注意,计数器用于将递增的数字分配给元素。还要注意,如果add(...)被多个线程调用,那么FIFO中的元素只是松散排序的。这迫使花哨的max(...)min(...)逻辑。这也是为什么这个位置是近似的。第一个和最后一个都是特例。第一个可以清楚地标明。Last比较棘手,因为当前的实现返回一个真实的索引。

由于这是一个大概的位置,我建议您考虑让API返回一个介于0.01.0之间的float,以指示队列中的相对位置。

如果您的代码需要支持使用pop(...)以外的其他方法进行删除,则需要使用近似大小,并将返回值更改为((id - min) / (max - min)) * size,并使用所有适当的int / float强制转换和舍入。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public abstract class ApproximateLocation<K extends Comparable<K>, T> {

    protected abstract K orderingKey(T element);

    private final ConcurrentMap<K, Wrapper<T>> _map = new ConcurrentSkipListMap<K, Wrapper<T>>();
    private final Deque<Wrapper<T>> _fifo = new LinkedBlockingDeque<Wrapper<T>>();
    private final AtomicInteger _counter = new AtomicInteger();

    public void add(T element) {
        K key = orderingKey(element);
        Wrapper<T> wrapper = new Wrapper<T>(_counter.getAndIncrement(), element);
        _fifo.add(wrapper);
        _map.put(key, wrapper);
    }

    public T pop() {
        Wrapper<T> wrapper = _fifo.pop();
        _map.remove(orderingKey(wrapper.value));
        return wrapper.value;
    }

    public int approximateLocation(T element) {
        Wrapper<T> wrapper = _map.get(orderingKey(element));
        Wrapper<T> first = _fifo.peekFirst();
        Wrapper<T> last = _fifo.peekLast();
        if (wrapper == null || first == null || last == null) {
            // element is not in composite structure; fifo has not been written to yet because of concurrency
            return -1;
        }
        int min = Math.min(wrapper.id, Math.min(first.id, last.id));
        int max = Math.max(wrapper.id, Math.max(first.id, last.id));
        if (wrapper == first || max == min) {
            return 0;
        }
        if (wrapper == last) {
            return max - min;
        }
        return wrapper.id - min;
    }

    private static class Wrapper<T> {
        final int id;
        final T value;

        Wrapper(int id, T value) {
            this.id = id;
            this.value = value;
        }
    }
}
票数 0
EN

Stack Overflow用户

发布于 2012-04-26 06:32:50

没有用于访问FIFO映射中的订单的API。唯一可以做到这一点的方法是遍历keySet()values()entrySet()并进行计数。

票数 1
EN

Stack Overflow用户

发布于 2012-04-26 06:39:52

如果您可以使用ConcurrentNavigableMap,那么headMap的大小将完全满足您的需求。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10328302

复制
相关文章
linux重命名文件名_linux 文件重命名
https://blog.csdn.net/weixin_33724570/article/details/91909917
全栈程序员站长
2022/09/30
4.1K0
linux重命名文件名_linux 文件重命名
linux批量文件重命名命令_shell重命名文件指令
hello_10_2016-03-17.log hello_4_2016-03-17.log hello_8_2016-03-17.log
全栈程序员站长
2022/10/02
10.7K0
在 Linux 中重命名文件夹中的所有文件
在Linux系统中,有时候我们需要批量重命名文件夹中的所有文件,以便更好地组织和管理文件。本文将详细介绍几种在Linux中重命名文件夹中所有文件的方法,包括使用命令行工具和脚本等方式。
网络技术联盟站
2023/06/08
5K0
在 Linux 中重命名文件夹中的所有文件
删除,重命名文件
重命名文件----rename #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> //修改文件名 void REname(char *arr) { int ret=rename("你好世界.txt", arr); if (ret == 0) { printf("修改成功"); } else { printf("修改失败"); } } void test01() { char buf[] = "你好,世界.txt"; REname(b
大忽悠爱学习
2021/03/02
1.7K0
删除,重命名文件
java删除文件,重命名文件
在做项目时,遇到需要对文件做一些删除重命名等操作。基于java语言,保存代码段如下。
全栈程序员站长
2022/08/12
1.8K0
linux中文件重命名_如何在Linux中重命名文件?
This tutorial will walk you through the simple steps to rename a file in Linux.
全栈程序员站长
2022/09/30
8.3K0
自制安装程序~单文件~可安装windows服务~技巧!类似安装QQ!
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Threading; using System.Xml; using System.IO; using System.IO.Compression; u
liulun
2022/05/09
4250
自制安装程序~单文件~可安装windows服务~技巧!类似安装QQ!
php案例 重命名文件
作者:陈业贵 华为云享专家 51cto(专家博主 明日之星 TOP红人) 阿里云专家博主 文章目录 代码 index.php 效果: 之前的 之后的 代码 index.php <?php //重命
贵哥的编程之路
2022/09/29
1.2K0
php案例 重命名文件
EditRename文件重命名工具
一款文件重命名工具。通过在文本编辑器中直接编辑多个文件的文件名来重命名文件,非常灵活,堪比一些强大的重命名工具,但更加易用。
季春二九
2023/03/24
1.1K0
EditRename文件重命名工具
python 图片重命名_python批量重命名文件
** 一个简单的python 脚本,用于图片批量重命名,非常简单但是也非常使用!
全栈程序员站长
2022/10/03
3.5K0
python 图片重命名_python批量重命名文件
文件批量重命名
# 把当前文件夹的所有文件重命名为 WF .... # 把这个路径下的所有文件先查找到 -- 遍历所有文件 :有一个新的名字WF .. rename(旧,新) import os file_path = os.getcwd() list1 = os.listdir(file_path) print(list1) # 当前目录每个名字前面加'WF ' for name in list1: new_name = 'WF ' + name os.rename(name, new_na
汪凡
2018/05/29
1.5K0
linux 重命名 文件夹_如何给文件批量重命名
上面的例子中,子模式 \d{4} 会捕捉4个连续的数字,捕捉的四个数字匹配模式对应 $1, 将会用于新的文件名。
全栈程序员站长
2022/09/30
7K0
linux 重命名 文件夹_如何给文件批量重命名
linux重命名文件和文件夹的区别_文件夹如何重命名
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/16
4.9K0
linux 文件重命名的命令是什么_linux移动文件并重命名
大家好,又见面了,我是你们的朋友全栈君。 就目前所知道的知识,有两种方法。 一、mv
全栈程序员站长
2022/09/30
5.6K0
cmd - 批量重命名文件
相信大家或多或少都遇到过类似的情况:从网上下载了好多图片(或者其他的文件),这些图片的名字往往都是些乱七八糟的字母数字的组合们想要一次性修改几十张上百张的图片的名字应该怎么办呢?
雨临Lewis
2022/01/11
2.8K0
cmd - 批量重命名文件
在Oracle中,如何移动或重命名数据文件?
其实利用OS拷贝也可以联机操作,不关闭数据库,但是只针对可以OFFLINE的数据文件,步骤如下所示:
AiDBA宝典
2023/04/27
1.8K0
在Oracle中,如何移动或重命名数据文件?
Python对文件进行重命名
import ossrcFile = './actwork/linkFile/allExtLinks - 副本.txt'dstFile = './actwork/linkFile/allExtLinks - copy.txt'try: os.rename(srcFile,dstFile)except Exception as e: print(e) print('rename file fail\r\n')else: print('rename file success\r\n')
狼啸风云
2020/10/28
1.5K0
使用shell对文件重命名
需要把上面2018年度下面的每个子目录的文件重命名,命名规则是就是改为1.jpg到n.jpg
咪啪咪啪
2019/11/15
1.1K0
点击加载更多

相似问题

css3中精灵图像的背景转换?

25

CSS3缩放动画背景图像精灵

12

褪色图像位置

21

设置背景中精灵图像位置的大小

20

jquery图像映射-如何更改背景精灵图像位置?

112
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文