扫描器Scanner、Set、Map的使用

本文详细介绍了Java中集合框架的使用方法,包括Scanner类的基本用法,Set集合及其迭代器的应用,以及Map集合的操作技巧。通过具体示例展示了如何进行数据的存储、检索和遍历。
public class 扫描器Scanner的使用 {
	public static void main(String[] args) {
		//定义一个扫描器对象
		Scanner scanner = new Scanner(System.in);
		扫描器Scanner的使用 t = new 扫描器Scanner的使用();
		int a;
		int b;
		while(true){
			//1.提示用户请输入一个加数
			System.out.println("请输入一个加数(整数):");
			//2.扫描一个整数
			a = scanner.nextInt();
			//3.提示用户请输入一个被加数
			System.out.println("请输入一个被加数(整数):");
			b = scanner.nextInt();
			
			int result = t.add(a, b);
			System.out.println("得到的结果是:"+result);
}

 
set集合以及迭代器的使用

public class Set集合的使用 {
	public static void main(String[] args) {
		//从Set集合中取值的时候按 哈希算法 取值
		Set<String> set = new HashSet<String>();

		boolean r1 = set.add("aaa");
		boolean r2 = set.add("bbb");
		boolean r3 = set.add("ccc");

		boolean r4 = set.add("eee");
		boolean r5 = set.add("fff");
		boolean r6 = set.add("ggg");

//		// System.out.println(set.contains("aaa"));
		// 我要你找fff内容
		// 获取/遍历set中的所有元素
		// 定义了一个迭代器,关联了set集合
		Iterator<String> iter = set.iterator();
		// 如何迭代
		while (iter.hasNext()) {
//              hasNext() 判断迭代器中有无元素  有则返回true
			String next = iter.next();
//              itter.next()   取值操作       
			System.out.println(next);
		}

		// 我要你找aaa

		// 获取/遍历set中的所有元素
		
	}

//	public String getFromSet(Set set ,String obj) {
//		// 定义了一个迭代器,关联了set集合
//		Iterator<String> iter1 = set.iterator();
//		// 如何迭代
//		while (iter1.hasNext()) {
//			String next = iter1.next();
//			if (next.equals(obj)) {
//				return next;
//			}
//		}
//		return null;
//	}
}

map集合的使用


public class Map集合的使用 {
	public static void main(String[] args) {
		Map<String,String> map = new HashMap<String,String>();
		
		map.put("a", "华信1");
//存值操作
		map.put("b", "华信2");
		map.put("c", "华信3");
		map.put("d", "华信4");
		
		//取数据
		String value = map.get("c");
		System.out.println(value);
		
		//map容器
		//涉及到map的遍历
               // 先取出map的k集合,遍历k的值找出对应的value值
		Set<String> keySet = map.keySet();
		Iterator<String> iterator = keySet.iterator();
		while(iterator.hasNext()){
			String k = iterator.next();
			String v = map.get(k);
			System.out.println("key="+k+"  value="+v);
		}
	
		
		
	}
}














将以下定时执行的方法优化为多线程处理,内部逻辑是需要对多个任务分别执行扫描,扫描完后修改任务状态,有很多个扫描器,扫描时间长。请推荐最佳实现方案:@Scheduled(fixedRate = 60000) public void checkPendingScannerData() { if (!initializationCompleted) return; log.info("开始检查待处理的扫描数据"); // 查询所有running状态和created状态的任务 List<Task> tasksList = taskMapper.selectList( new LambdaQueryWrapper<Task>() .in(Task::getStatus, TASK_STATUS_RUNNING, TASK_STATUS_CREATED) ); if (CollUtil.isEmpty(tasksList)) { log.info("没有发现 running 或 created 状态的任务"); return; } // 提取任务 ID Set<Long> taskIds = tasksList.stream().map(Task::getId).collect(Collectors.toSet()); // 查询这些任务对应的 ScannerData 数据,状态为 SCANNER_STATUS_PENDING List<ScannerData> scannerDataList = scannerDataService.list( new LambdaQueryWrapper<ScannerData>() .in(ScannerData::getTaskId, taskIds) .eq(ScannerData::getStatus, IScannerDataService.SCANNER_STATUS_PENDING) ); if (CollUtil.isEmpty(scannerDataList)) { log.info("这些任务没有对应的状态为 SCANNER_STATUS_PENDING 的 ScannerData 数据"); return; } log.info("发现 {} 条状态为 SCANNER_STATUS_PENDING 的 ScannerData 数据", scannerDataList.size()); // 更新扫描器对应任务节点为开始状态 tasksList.forEach(task -> { task.setNode(TaskNodeEnum.START.getCode()); task.setStatus(TASK_STATUS_RUNNING); }); taskMapper.updateBatch(tasksList); for (ScannerData scannerData : scannerDataList) { try { // 手动提交事务,每执行一个扫描器逻辑就提交 transactionTemplate.execute(status -> { ScannerData lockedData = null; try { // 使用悲观锁锁定单条数据 lockedData = scannerDataService.getOneForUpdate( new LambdaQueryWrapper<ScannerData>() .eq(ScannerData::getId, scannerData.getId()) .eq(ScannerData::getStatus, IScannerDataService.SCANNER_STATUS_PENDING) ); // 检查锁获取结果 if (lockedData == null) { log.warn("数据已被其他线程处理,ID:{}", scannerData.getId()); return null; // 跳出当前事务 } // 获取扫描器实例 AbstractScanner scanner = scannerFactory.createScanner(lockedData); // 执行扫描逻辑 scanner.triggerScan(lockedData); scannerDataService.updateById(lockedData); log.info("扫描任务处理成功,ID:{},扫描器类型:{}", lockedData.getId(), scanner.getClass().getSimpleName()); } catch (Exception e) { status.setRollbackOnly(); // 里层标记手动事务回滚 throw new RuntimeException(e); // 包装为unchecked异常 } return null; }); } catch (Exception e) { // 这边因为要独立更新状态,不能包含在手动提交的事务中。不然可能因为里层的异常事务回滚,导致事务无法提交 ScannerData failedData = new ScannerData(); failedData.setId(scannerData.getId()); failedData.setStatus(IScannerDataService.SCANNER_STATUS_FAILED); failedData.setErrMsg(e.getMessage()); scannerDataService.updateById(failedData); log.error("处理扫描数据失败,ID:{}", scannerData.getId(), e); } } }
10-21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值