一个记录最近搜索历史的LRU实现

SCADA|用KingSCADA实现设备台账的查询功能 以上为用KingSCADA实现设备台账的查询功能,另外还有一些细节功能,比如当点击增加按钮时弹出的信息窗口内的信息希望是在选中的某行信息,只要找到差不多的设备,修改个别参数即可,避免增加时弹出空白页,所有信息都需要填写。以上为实现设备台账查询的最简单实现,实际项目中可能会更复杂,你做过哪些设备台账或相关的功能,有比较好的创意或高难度功能方法,欢迎在留言区评论,或在交流群探讨,互通有无,共同进步。首先完成界面的组态工作,主要是通过查询按钮,查询SQLServer数据库的设备台账数据,然后填充到报表内。 阅读详情
对于很多有搜索需求的功能,一般需要展示下最近n次的历史搜索记录,主要有以下几个功能点:
  • 最近搜索条目放在最前面,最早的搜索记录放在最后。
  • 只记录最近n条数据,如果超过n条搜索记录,删除搜索时间最久远的记录。
  • 没有重复的搜索项,如果新搜索的关键字已存在,则将该关键字提到最前面,删除原位置关键字。
  • 可方便的持久化,并可以通过读取持久化数据,恢复原纪录历史。

基于以上这些条件,不难看出这就是一个无重复数据的LRU stack,本来以为java集合会有支持该需求的实现,尝试了stack等集合类型,发现不是很好弄,最后还是采用list做一个吧,简单方便。

Android版:
public class SearchHistoryUtil {
    private LruStackUtil mLruStack = null;

    public SearchHistoryUtil(int maxSize) {
        this.mLruStack = new LruStackUtil(maxSize);
    }

    public void updateSearchHistorys(Context context, String keyWord) {
        SharedPreferences sharedPreferences = context.getSharedPreferences("music_search_history",
                Activity.MODE_PRIVATE);
        String mKeys = sharedPreferences.getString("keys", "");
        mLruStack.reset();
        SharedPreferences.Editor editor = sharedPreferences.edit();

        String[] tmpHistory = mKeys.split(",");
        for (String i : tmpHistory) {
            mLruStack.push(i);
        }
        mLruStack.pushHead(keyWord);
        editor.putString("keys", mLruStack.getAll());
        editor.apply();
    }

    public static String getAllHistorys(Context context) {
        SharedPreferences sharedPreferences= context.getSharedPreferences("music_search_history",
                Activity.MODE_PRIVATE);
        String mKeys = sharedPreferences.getString("keys", "");
        return mKeys;
    }

    public static void clearAll(Context context) {
        SharedPreferences sharedPreferences = context.getSharedPreferences("music_search_history",
                Activity.MODE_PRIVATE);

        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.clear();
        editor.apply();
    }
}

public class LruStackUtil {
    ArrayList<String> stack = null;
    private int size = 0;

    public LruStackUtil(int size) {
        this.stack = new ArrayList<String>();
        this.size = size;
    }

    public void pushHead(String keyWord) {
        if (stack.remove(keyWord)) {
            stack.add(0, keyWord);
            return;
        }

        if (stack.size() > this.size - 1) {
            stack.remove(stack.size() - 1);
            stack.add(0, keyWord);
        } else {
            stack.add(0, keyWord);
        }
    }

    public void push(String keyWord) {
        if (stack.contains(keyWord)){
            return;
        }

        if (stack.size() > this.size - 1) {
            return;
        } else {
            stack.add(keyWord);
        }
    }

    public String getAll() {
        StringBuilder str = new StringBuilder();
        for (int i = 0; i < stack.size(); i++) {
            str.append(stack.get(i) + ",");
        }

        return str.toString();
    }

    public void reset() {
        if (stack != null) {
            stack.clear();
        }
    }
}

其实这个实现完全没有任何技术难度,只是尽量将改功能模块化,接口化,方便调用。

【推荐100个unity插件】动画重定向,快速在不同角色间共享动画,共用非人形Humanoid(泛型generic)动画——Retarget Pro Retarget Pro是一款高效的Unity动画重定向工具,可快速在不同角色间共享动画。主要特点包括:1分钟快速设置,支持编辑器和运行时重定向;适用于人形、动物、武器等各类角色;提供基础重定向、IK重定向和FPS专用重定向三种功能模块;通过Rig组件和骨架资产实现骨骼链匹配,支持批量处理。插件包含示例项目和预设资源,操作简便且效果优于Unity原生Humanoid系统,特别适合处理手指等精细动画。 阅读详情

相关推荐

告别迷茫!用ETAS RTA-OS配置你的第一个AUTOSAR OS任务(含VRTA虚拟ECU实战)

本文详细介绍了如何使用ETAS RTA-OS工具链在VRTA虚拟ECU上配置和运行第一个AUTOSAR OS任务。通过从XML配置到任务调度的全流程实战,帮助开发者快速掌握嵌入式操作系统开发的核心步骤,特别适合刚接触AUTOSAR的开发者快速上手。

weixin_42533622的博客 418

LRU算法:商品浏览历史排序

// id字符串 :  使用LRU算法 // 原有的cookie中的id            当前新访问的书的id  应该写回的id bookHistory的取值 // a.  cookie[] cs为null         1 1 // b.  没有bookHistory中的cookie       1         1 // c.  1 2 2-1 // d.  2-

忧桑的小猿猿 365

Python实战:用MNE-Python从脑电数据中提取P300成分(附完整代码)

本文提供了一份使用MNE-Python从脑电数据中提取P300成分的完整实战指南。通过详细的代码示例,系统讲解了从环境搭建、数据加载、预处理(滤波、分段、伪迹剔除)到P300波形提取、可视化与参数量化的全流程。重点介绍了如何利用零相位滤波和叠加平均技术,从EEG信号中精准分离出反映认知加工的P300事件相关电位,适用于脑机接口与认知神经科学研究。

weixin_29240343的博客 338

Android Lru的简单使用

Lru 算法(缓存淘汰算法) LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。(PS:有兴趣可以用链表自己实现) Android LruCache 在Android LruCache中的原理比较简单,有兴趣可以自己去了解.具体的代码这里就不放了.    1 LruCa...

yushu1995的博客 1385

A B C三个气象站的小波分析结果解读

在小波分析的过程中,信号的不同频率分量会在不同的尺度上显现,而纵轴上的数值表示信号在相应尺度上的强度或能量。2. **小波方差的横轴(水平轴)**:横轴上的尺度表示用于分析的小波函数的尺度。1. **共同趋势:** 在所有三个点的小波方差图中,随着尺度的增加,方差逐渐增大,尤其是在较大的时间尺度上。3. **尺度30的特殊性:** 在所有点的小波方差图中,尺度30似乎是一个特殊的点,对应着一个较长的时间尺度上的波动或变化。2. **方差的大小:** 方差的大小反映了在相应尺度下信号的波动强度。

weixin_44259522的博客 859

FUXA实战:5步搞定基于Web的SCADA系统搭建(含Node.js版本避坑指南)

本文提供了一份基于开源工具FUXA搭建Web版SCADA系统的实战指南。文章重点解析了从环境准备到生产部署的五个核心步骤,并特别强调了Node.js版本选择对西门子S7 PLC通信兼容性的关键影响,帮助开发者避开常见陷阱,快速构建工业监控界面。

weixin_29172963的博客 140

LRU算法四种实现方式介绍

LRU全称是Least Recently Used,即最近最久未使用的意思。 LRU算法的设计原则是:如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小。也就是说,当限定的空间已存满数据时,应当把最久没有被访问到的数据淘汰。 实现LRU       1.用一个数组来存储数据,给每一个数据项标记一个访问时间戳,每次插入新数据项的时候,先把数组中存

elricboa的专栏 20万+

高通平台Android稳定性调试笔记:手把手教你用T32、Crash Utility分析Kernel Panic与RAM Dump

本文详细介绍了高通平台Android内核崩溃的分析方法,包括使用T32 Simulator和Crash Utility工具链解析Kernel Panic与RAM Dump。从环境配置、dump文件预处理到高级调试技巧,手把手教你如何定位和解决Android系统崩溃问题,特别适用于MSM/SA8155平台的开发者。

weixin_42543046的博客 527

搜索,并且缓存搜索历史记录

1、将关键字加入cookie缓存中 /// <summary> /// 添加搜索关键字 /// </summary> /// <param name="keyWord"></param> private void addKeyWord(string keyWord) ...

dingrongzhi8721的博客 278

mabl:AI原生测试自动化平台的基础使用

mabl是一个基于人工智能和机器学习的云原生测试自动化平台。它通过使用先进的技术,如机器学习,自动创建和执行测试,自动分析测试结果,并根据需求的变化自动适配和维护测试。这样的自动化过程极大地提高了软件测试的效率和准确性。mabl的口号是 “You write code, mabl tests”,意味着开发者只需关注编写代码,而测试工作则可以交给mabl来完成。mabl的平台支持多种测试类型,包括 Web、App、Api、可访问性和性能测试,使得团队能够更快速、更有信心地发布软件。

blues_C的博客 3657

【ROS】Nav2源码之nav2_collision_monitor(碰撞监测)详解

nav2_collision_monitor碰撞监视器是一个节点,为机器人提供了一个额外的安全级别。它使用来自传感器的数据,执行若干与避免碰撞相关的任务,绕过成本图和轨迹规划器,监测是否需要紧急停止或者减速。

郭老二 1456

Android搜索功能存储本地数据 集合 + SharedPreferences

很笨的方法 还是记录一下

lj624226744的博客 1595

《AgentScope-Java 深入浅出教程》第8章 工具高级特性

掌握工具组、预设参数、执行上下文等高级特性。

步子哥的博客 265

mongodb 实现历史记录

数据模型,go相关学习资料:https://edu.51cto.com/video/442.htmlhttps://edu.51cto.com/video/4196.htmlMongoDB 实现历史记录 MongoDB 是一种流行的 NoSQL 数据库,它以灵活的文档结构和高性能著称。在许多应用场景中,我们可能需要记录...

weixin_40265970的博客 268

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

TranslationPlugin高级搜索功能:快速定位翻译历史记录的技巧

你是否曾在使用TranslationPlugin时,因频繁翻译相似内容却找不到历史记录而重复劳动?是否希望通过关键词快速筛选 weeks 前的翻译记录?本文将系统讲解TranslationPlugin历史记录搜索的底层原理、进阶操作与效率技巧,帮你彻底释放翻译记忆的价值。 ## 核心功能解析:历史记录系统架构 TranslationPlugin的历史记录功能基于**内存缓存+持久化存储**双引...

gitblog_00896的博客 817

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

用 Go 实现一个 LRU cache

前言早在几年前写过关于 LRU cache 的文章:https://crossoverjie.top/2018/04/07/algorithm/LRU-cache/当时是用 Java 实现...

crossoverJie专栏 361

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

LRU算法原理及其实现

LRU是个很常见的置换淘汰算法,在资源管理和缓存方面有很多应用,例如著名的redis中就有其相关应用。

如果看到我更新了,说明我今天摸鱼大成功 1039

React Native在OpenHarmony中实现搜索历史功能

跨平台开发框架React Native与新一代智能终端操作系统OpenHarmony的结合,为移动应用开发带来了高效与分布式能力的双重优势。React Native基于JavaScript和React技术栈,支持热重载和丰富的社区资源,显著提升开发效率。OpenHarmony则提供了强大的分布式能力,支持设备间数据同步。在搜索功能实现中,搜索历史记录通过AsyncStorage持久化存储,结合OpenHarmony的分布式特性,可实现跨设备同步,提升用户体验。本文以SearchBar组件为例,详细介绍了如何

weixin_33164198的博客 265

我用几个 bit 实现了 LRU,你不好奇吗?

我用几个 bit 实现了 LRU,你不好奇吗?常规的 LRU 算法实现redis 近似 LRU 实现bit 级别模拟 LRU1bit 模拟 LRUbit 搜索树模拟 LRU喜欢本文的朋友,欢迎关注公众号「跬步匠心」, 专注大白话分享实用技术。 文章首发于公众号「跬步匠心」 原文链接:mp.weixin.qq.com/s… 提到缓存,我们肯定都不陌生,由于大部分系统的数据都存在局部性,即有些数据是经常被使用到的,我们可以将其先缓存起来,这样,一方面能提高系统的吞吐量;另一方面也能降低数据库等第三方系统的请

zsgg123的博客 696

Redis实战:如何高效实现搜索历史与自动补全功能

本文详细介绍了如何利用Redis高效实现搜索历史与自动补全功能。通过Redis的列表(List)数据结构管理个人搜索历史,确保记录最新且唯一;并重点阐述了如何利用有序集合(Sorted Set)实现全局自动补全组件,支持按前缀匹配和热度排序,有效提升搜索体验与系统性能。

weixin_29038345的博客 183

EverythingToolbar搜索历史功能的技术解析与使用技巧

EverythingToolbar搜索历史功能的技术解析与使用技巧 【免费下载链接】EverythingToolbar Everything integration for the Windows taskbar. 项目地址: h...

gitblog_07260的博客 557

Redisson中RList的使用场景及用它来做用户历史浏览记录的例子

redisson

qq_40592590的博客 1479

商品搜索记录“秒级”加载:Redis缓存+LRU算法的终极实现方案

摘要:本文介绍基于Redis+SpringBoot实现电商搜索框的毫秒级"最近搜索"功能。利用Redis的List结构,通过LPUSH+LTRIM组合命令实现搜索记录的去重、排序和裁剪(最多10条),数据按用户ID存储并设置7天过期。代码示例展示了3个核心接口:保存搜索记录、获取列表和清空历史。该方案单机QPS可达3万+,99线延迟低于2ms,内存占用仅约100MB/百万用户。相比MySQL,Redis能更好应对高频写入场景,显著提升用户体验。

nihao2q的博客 541

10秒定位3年查询记录:DBeaver查询历史索引优化实战

你是否经历过在数千条SQL查询历史中翻找某段代码的痛苦?当查询记录超过10万行时,普通文本搜索往往需要等待30秒以上,甚至导致界面卡顿。本文将详解DBeaver如何通过全文搜索索引机制,将大型查询历史的搜索性能提升100倍,并提供从配置到高级优化的完整指南。 ## 索引优化原理与架构 DBeaver的查询历史管理模块基于QM(Query Manager)框架实现,核心源码位于[plugins/...

gitblog_00692的博客 774

LRU缓存淘汰算法优化

上文中提到了LRU 缓存淘汰算法,可以帮助我们更好更合理的去使用缓存。但是它也有一个缺点就是如果有一些不满足“如果数据最近被访问过,那么将来被访问的几率也更高”的规律时,会破坏缓存,导致性能下降。如果缓存的容量比较小,这样还会导致一些热点搜索词的缓存被替换了出去,有可能导致一瞬间大量的请求访问DB 发生缓存击穿。或者 偶然的数据影响会造成命中率较低,比如某个数据即将到达底部即将被淘汰,但由于一次的...

u012957549的博客 3781

10倍速提升DBeaver查询历史搜索:从卡顿到毫秒级响应的优化指南

你是否曾在DBeaver中搜索数月前的SQL查询历史时,遭遇界面卡顿甚至无响应?当查询记录超过1000条时,默认搜索功能往往需要3-5秒才能返回结果。本文将从索引优化、缓存策略、查询重构三个维度,详解如何将大型历史记录的搜索速度提升10倍以上,同步提供可直接操作的配置方案与源码级优化思路。 ## 核心瓶颈分析:为什么查询历史会变慢? DBeaver的查询历史默认存储在SQLite数据库中,路径...

gitblog_00987的博客 658
上一篇: Android应用开发—Intent组件详解
下一篇: Android应用开发—如何解决handler的警告:Handler Class Should be Static or Leaks Occur
voidreturn
博客等级 码龄10年 53粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值