Java 第6️⃣天

本文深入探讨Java中的Collection集合,解析其解决数组长度及类型限制问题的能力。对比ArrayList与LinkedList的性能差异,阐述Set集合的不重复性和乱序特性,以及HashSet如何通过hash值去重。

Collection 集合以及 类族
为什么存在?
常用数据类型不能满足 更高要求的数据结构
比如常见问题: 一个数组声明了一种类型,那么这个数组里面不能存放其他类型的变量和数值。在不确定数值长度的时候,集合能够很好满足这个要求。
有了Collection 就可以,通过它实现 了一个list ,list中可以存放不同类型的变量。比如:

它的特性:
它属于java.util 工具包
继承于 Iterable 是可遍历的
size可变
没有顺序性要求,也就是遍历的结果跟放进去的顺序是一样的

作用:为了解决数组中存放长度问题以及单一类型问题

基于Collection实现的list

list 代表着存放有顺序和遍历也是有顺序的一组元素
存放 使用的是链表 Data Structure,长度要求也没有限制。

  • 常用的数组 实现ArrayList
    由于list 是一个继承与Collection的接口,所以要实现它接口中的方法

如下代码只是用数组部分实现了list,学习参考
思路:创建一个对象数组 ,然后初始化数组长度(长度有限制),通过角标赋值。

  • 使用 引用类型实现LInkedList
    在这里插入图片描述
    思路 : 创建一个类,继承 list接口,然后用一个类来封装,有3个参数,分别是前一个节点,后一个节点,每个结点可以是不同的类值(故 这里用Object 来做形式参数)

以上实现的都不够完整,不能用于实际开发。
而java 提供了一个list类 包括了很多方法,使用时直接调用即可。
有意思的方法: 当长度超过初始化长度是,它会利用grow方法来判断是否进行增加长度,并且不丢失原有数据

ArrayList 和Linkedlist的区别:

查找:
linkedlist 进行查找某个元素时要从头遍历
Array则不用,直接用索引得到

新增:
linkedlist 直接在原有的链表尾端加一个结点
Arraylist 则需要再创建一个数组,再把原有的元素放到新数组上。

使用场景:
ArrayList 通常用于 查找次数 大于 存储次数的情况 比如家用硬盘(经常读写)和 摄像头存储硬盘(主要是保留证据)的区别
Linkedlist 通常用于 存储次数 大于 查找的情况

Collection 的 set集合
什么是set?
set 是一个元素不重复 , 乱序性的集合,其中的元素两两不相等,每一次增加元素,排序都会变化。
在这里插入图片描述
结果如图
在这里插入图片描述
使用场景:
基于set 实现的HashSet。使用元素的hash值帮忙去重的。
注意事项:
由于set 是不重复的,所有set放的元素是不变的。如果放进去的类型是可变的,那么我们在使用的时候尽量不要去变化这个值。如果变化了,set也没有做变化。

// 启用无障碍服务(必需) auto(); // 设置屏幕分辨率(请根据实际设备修改) setScreenMetrics(1080, 1920); // CSV 文件路径 var filePath = "/sdcard/autojs/tasks.csv"; // 主函数 function main() { // 读取 CSV 获取任务列表 var tasks = readCsv(filePath); if (!tasks || tasks.length === 0) { toast("未加载到任务数据"); return false; } toast("开始执行 " + tasks.length + " 个任务..."); for (var i = 0; i < tasks.length; i++) { var task = tasks[i]; var taskName = task["任务名称"]; if (!taskName || String(taskName).trim() === "") { toast("跳过空任务: 第" + (i+1) + "条"); continue; } toast("正在处理第" + (i+1) + "个任务: " + taskName); sleep(1000); // 复制任务名称到剪贴板 setClip(taskName); toast("已复制: " + taskName); sleep(800); // 查找并点击“搜索”输入框(可以根据 id 或 text 修改定位方式) if (clickSearchBox()) { sleep(1500); // 模拟粘贴(通常长按输入框后出现粘贴按钮) if (pasteFromClipboard()) { sleep(1200); // 执行搜索动作:比如点击“搜索”按钮或回车键 performSearch(); sleep(2000); // 等待结果加载 // 【此处添加你的“后续任务”逻辑】 doAfterSearch(taskName); // 如点击结果、截图、判断是否存在等 // 返回上一页 back(); sleep(1200); } else { toast("粘贴失败,跳过该任务"); back(); sleep(800); } } else { toast("未找到搜索框,跳过任务: " + taskName); } // 可选:防止过快连续操作 sleep(1000); } toast("所有任务执行完毕!"); } /** * 读取 CSV 文件并解析为数组对象 */ function readCsv(path) { try { var BufferedReader = java.io.BufferedReader; var FileReader = java.io.FileReader; var File = java.io.File; var file = new File(path); if (!file.exists()) { toast("文件不存在: " + path); return null; } var reader = new BufferedReader(new FileReader(file)); var lines = []; var line; while ((line = reader.readLine()) !== null) { lines.push(line.trim()); } reader.close(); if (lines.length < 2) { toast("CSV 文件为空或只有标题"); return null; } var headers = lines[0].split(',').map(trimQuotes); var result = []; for (var i = 1; i < lines.length; i++) { var values = lines[i].split(',').map(trimQuotes); var row = {}; headers.forEach(function(header, idx) { row[header] = values[idx] || ""; }); result.push(row); } return result; } catch (e) { toast("读取 CSV 出错: " + e.message); console.error(e); return null; } } function trimQuotes(str) { return str ? str.trim().replace(/^"(.*)"$/g, '$1') : ''; } /** * 点击搜索框(根据你的 App 修改选择器) * 示例:通过提示文字“搜索”或 className 是 EditText */ if (text("搜索").exists()) { sleep(100); // 清除操作 if (id("iv_clear").exists()) { id("iv_clear").findOne().click(); sleep(500); } // 点击输入框并粘贴 if (id("et_search").exists()) { id("et_search").findOne().click(); sleep(500); paste(); sleep(500); } // 点击查找 if (id("tv_content").exists()) { var controlObj = id("tv_content").findOne(); click(controlObj.bounds().centerX(), controlObj.bounds().centerY()); sleep(3000); } } /** * 例如:判断是否找到内容、点击第一个结果、截图等 */ function doAfterSearch(taskName) { // 1️⃣ 获取当前商品的“任务名称” var taskName = getTaskName(); // 2️⃣ 检查是否为黑名单商品(剔除关键词) if (isExcluded(taskName)) { log("🚫 跳过黑名单商品"); back(); // 返回列表页 sleep(1500); continue; // 跳过后续所有操作 } //检查黑名单后,获取在售数量,点击磨损度,点击磨损区间 // 获取数量并判断 var w = className("android.widget.TextView").id("tv_current_sum1").findOne(500); if (w) { var text1 = w.text(); var match1 = text1.match(/(\d+)/); var n = 0; if (match1) { n = parseInt(match1[1], 10); } if (n < THRESHOLD) { console.log("商品数量小于" + THRESHOLD + ",执行点击操作。"); toastLog("提取到的商品数量为: " + match1); sleep(500); } //点击区间间 if (text("磨损区间").exists()) { var fw = text("磨损区间").findOne(); click(fw.bounds().centerX(), fw.bounds().centerY()); sleep(800); // 选择磨损区间 var list = id("rv_sort_list").findOne(2000); if (list) { try { var children = list.children(); if (children.size() > 5) { var item = children.get(1); click(item.bounds().centerX(), item.bounds().centerY()); } } catch (e) {} } } // 3️⃣ 执行磨损筛选流程(核心逻辑入口) var result = processWearFilter(); // 4️⃣ 分析结果并决定是否记录 if (result && result.shouldRecord) { // 5️⃣ 写入CSV文件(包含详细数据) writeToCSV(result); // 6️⃣ 更新成功计数 + 弹出提示 successCount++; } else { toast("🟡 条件不满足,未记录该商品"); } // 7️⃣ 完成处理后返回上一页(回到列表) back(); sleep(1000); // ============ 开始执行 ============ main(); 根据以上脚本注释修改
最新发布
11-15
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值