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

使用语言:JAVA


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


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


[java]  view plain  copy
  1. /** 
  2.  * 按照异常批次号对已开单数据进行分组 
  3.  * @param billingList 
  4.  * @return 
  5.  * @throws Exception 
  6.  */  
  7. private Map<String, List<TmExcpNewVo>> groupBillingDataByExcpBatchCode(List<TmExcpNewVo> billingList) throws Exception{  
  8.     Map<String, List<TmExcpNewVo>> resultMap = new HashMap<String, List<TmExcpNewVo>>();  
  9.       
  10.     try{  
  11.         for(TmExcpNewVo tmExcpNew : billingList){  
  12.               
  13.             if(resultMap.containsKey(tmExcpNew.getExcpbatch())){//map中异常批次已存在,将该数据存放到同一个key(key存放的是异常批次)的map中  
  14.                 resultMap.get(tmExcpNew.getExcpbatch()).add(tmExcpNew);  
  15.             }else{//map中不存在,新建key,用来存放数据  
  16.                 List<TmExcpNewVo> tmpList = new ArrayList<TmExcpNewVo>();  
  17.                 tmpList.add(tmExcpNew);  
  18.                 resultMap.put(tmExcpNew.getExcpbatch(), tmpList);  
  19.                   
  20.             }  
  21.   
  22.         }  
  23.           
  24.     }catch(Exception e){  
  25.         throw new Exception("按照异常批次号对已开单数据进行分组时出现异常", e);  
  26.     }  
  27.       
  28.     return resultMap;  
  29. }  
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值