将List中的实体按照某个字段进行分组的算法

 

如何将List中存放的实体按照某个字段进行分组呢?来看看下面的例子,假如实体中有个字段叫批次号,我们将具有相同批次号的实体放在一起,那么怎么实现呢?看下面的代码:

可以定义个Map,Map的key用于存放异常批次号,value存放实体集合List<ShopResource>。循环要排序的List

public class ShopAndShopResourceUtil {
	public Map<String, List<ShopResource>> shopResourceGroup(List<ShopResource> shopResourceList) throws Exception {
		
		Map<String, List<ShopResource>> resultMap = new HashMap<String, List<ShopResource>>();

		try {
			for (ShopResource shopResource : shopResourceList) {
				// map中key已存在,将该数据存放到同一个key(key存放的是一级品种code + 交货地code)的map中
				if (resultMap.containsKey(shopResource.getFirstCategoryCode() + shopResource.getAreaCode())) {
					resultMap.get(shopResource.getFirstCategoryCode()).add(shopResource);
				} else {
					// map中不存在,新建key,用来存放数据
					List<ShopResource> tmpList = new ArrayList<ShopResource>();
					// 如果有某条资源非标,缺失字段
					if(StringUtils.isEmpty(shopResource.getFirstCategoryCode()) || StringUtils.isEmpty(shopResource.getAreaCode()))
					{
						tmpList.add(shopResource);
						resultMap.put("noStandard", tmpList);
					}else {						
						tmpList.add(shopResource);
						resultMap.put(shopResource.getFirstCategoryCode() + shopResource.getAreaCode(), tmpList);
					}

				}

			}

		} catch (Exception e) {
				throw new Exception("按照一级品种code加交货地code进行分组时出现异常", e);
		}
		
		return resultMap;
	}
}


点关注,不迷路

文章每周持续更新,可以微信搜索「 十分钟学编程 」第一时间阅读和催更,如果这个文章写得还不错,觉得有点东西的话 ~求点赞👍 求关注❤️ 求分享❤️ 
各位的支持和认可,就是我创作的最大动力,我们下篇文章见!

MACD是一种趋势指标,用于分析股票价格的变化趋势。在Spring Boot,可以通过编写自定义算法来计算每日的MACD数据,并返回带有日期的数据。 下面是一个简单的实现方法: 1. 定义一个实体类来存储每日的股票价格数据,包括开盘价、收盘价、最高价、最低价和日期等字段。 ```java public class StockData { private Double openPrice; private Double closePrice; private Double highPrice; private Double lowPrice; private Date date; // getter and setter methods } ``` 2. 编写一个算法来计算每日的MACD数据。MACD的计算需要用到指数移动平均线(EMA),可以通过递归的方式来计算。具体代码实现如下: ```java public class MacdCalculator { private static final int SHORT_PERIOD = 12; private static final int LONG_PERIOD = 26; private static final int SIGNAL_PERIOD = 9; public List<MacdData> calculate(List<StockData> stockDataList) { List<MacdData> macdDataList = new ArrayList<>(); double shortEma = 0; double longEma = 0; double signalEma = 0; double prevSignalEma = 0; for (int i = 0; i < stockDataList.size(); i++) { StockData stockData = stockDataList.get(i); // 计算短期EMA if (i == 0) { shortEma = stockData.getClosePrice(); } else { shortEma = calculateEma(stockData.getClosePrice(), shortEma, SHORT_PERIOD); } // 计算长期EMA if (i == 0) { longEma = stockData.getClosePrice(); } else { longEma = calculateEma(stockData.getClosePrice(), longEma, LONG_PERIOD); } // 计算DIF double dif = shortEma - longEma; // 计算信号线 if (i == 0) { signalEma = dif; } else { signalEma = calculateEma(dif, prevSignalEma, SIGNAL_PERIOD); } prevSignalEma = signalEma; // 计算MACD double macd = dif - signalEma; MacdData macdData = new MacdData(); macdData.setDate(stockData.getDate()); macdData.setDif(dif); macdData.setSignal(signalEma); macdData.setMacd(macd); macdDataList.add(macdData); } return macdDataList; } private double calculateEma(double currentPrice, double prevEma, int period) { double k = 2.0 / (period + 1); return currentPrice * k + prevEma * (1 - k); } } ``` 3. 在Spring Boot,可以将算法封装成一个RESTful API服务,以便于其他系统调用。具体实现可以参考以下代码: ```java @RestController public class MacdController { @Autowired private MacdCalculator macdCalculator; @PostMapping("/macd") public List<MacdData> calculateMacd(@RequestBody List<StockData> stockDataList) { return macdCalculator.calculate(stockDataList); } } ``` 4. 为了优化算法的性能,可以考虑使用并发计算来加速MACD数据的计算。可以使用Java的并发框架来实现。具体实现可以参考以下代码: ```java public class ParallelMacdCalculator { private static final int SHORT_PERIOD = 12; private static final int LONG_PERIOD = 26; private static final int SIGNAL_PERIOD = 9; public List<MacdData> calculate(List<StockData> stockDataList) { List<MacdData> macdDataList = new ArrayList<>(); double shortEma = 0; double longEma = 0; double signalEma = 0; double prevSignalEma = 0; int numProcessors = Runtime.getRuntime().availableProcessors(); ExecutorService executorService = Executors.newFixedThreadPool(numProcessors); List<Future<MacdData>> futures = new ArrayList<>(); for (int i = 0; i < stockDataList.size(); i++) { StockData stockData = stockDataList.get(i); // 计算短期EMA if (i == 0) { shortEma = stockData.getClosePrice(); } else { shortEma = calculateEma(stockData.getClosePrice(), shortEma, SHORT_PERIOD); } // 计算长期EMA if (i == 0) { longEma = stockData.getClosePrice(); } else { longEma = calculateEma(stockData.getClosePrice(), longEma, LONG_PERIOD); } // 计算DIF double dif = shortEma - longEma; // 计算信号线 if (i == 0) { signalEma = dif; } else { signalEma = calculateEma(dif, prevSignalEma, SIGNAL_PERIOD); } prevSignalEma = signalEma; // 计算MACD double macd = dif - signalEma; Future<MacdData> future = executorService.submit(() -> { MacdData macdData = new MacdData(); macdData.setDate(stockData.getDate()); macdData.setDif(dif); macdData.setSignal(signalEma); macdData.setMacd(macd); return macdData; }); futures.add(future); } for (Future<MacdData> future : futures) { try { macdDataList.add(future.get()); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } } executorService.shutdown(); return macdDataList; } private double calculateEma(double currentPrice, double prevEma, int period) { double k = 2.0 / (period + 1); return currentPrice * k + prevEma * (1 - k); } } ``` 这样,我们就可以使用Spring Boot来实现一个计算股票MACD的应用,并通过并发计算来提高算法的性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蒋老湿

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值