根据特定条件拆分地图

我有一张地图如下图所示:

Key Value 23 20 32 20 (20+20 =40 , min=23 max=32) 43 18 45 24 (24+18 =42 , since 42 >40 so here min and max will be same that is 43 47 10 56 6 (24 +10 +6 =40) so here min =45 and max = 56 49 2 47 12 

如您所见,将有一个名为split的最终常量,其值为40

 final int SPLIT = 40; //this will be configurable as it value can be changed. 

我必须实现逻辑,例如,如果地图的值达到40,那么计算开始的地图的第一个键和恰好达到40的键将被选为min和max,如上所述。

除此之外,如果总和达到40以上,则需要小心。如果是这样,我们必须忽略它并在min和max相等的情况下将前一个值本身作为min和max。

请建议我如何使用Java和Map实现这一目标。 伙计们请指教

我正在进行geeting的数据不是来自数据库我正在从对象列表中的hibernate标准进行竞争

我从Hibernate标准中获取一个列表,如下所示……

  List abcObjectsList= session.createCriteria(dddObject.class) 

检查时,我正在以这种格式获取数据

 abcObjectsList= ArrayList elementData =Object[3] [0] = Long ----------> value 23 [1] = Integer -------> value 20 [0] = Long ----------> value 32 [1] =Integer -------> value 20 [0] =Long ----------> value 43 [1] =Integer -------> value 18 

我把它存储在地图中,就像我要求它以同样的方式

  Map result = new HashMap(); for (Object[] arr : list) { result.put((Long) arr[0], (Integer) arr[1]); } 

所以最后地图将包含..

  Key Value 23 20 32 20 (20+20 =40 , min=23 max=32) 43 18 

您可以创建一个将保存键和值的Pair类,而不是使用Map。

 class Pair { public int key; public int value; public Pair(int key, int value){ this.key = key; this.value = value; } } 

然后创建一个对列表并迭代它。 如果总和为0,则初始化最小值和最大值。 然后,对于迭代的每一对,将其值添加到总和。 如果总和较差,则继续循环并更新最大密钥,否则您有两种情况可能:

  1. 总和等于限制,因此更新最大密钥
  2. 总和不等于限制(因此它更优越),减少索引并且不更新最大密钥

 public static void main(String[] arg) { List indexList = Arrays.asList(23,32,43,45,47,56,49,47); // get this from database List valueList = Arrays.asList(20,20,18,24,10,6,2,12); // get this from database List pairList = new ArrayList<>(); for(int i = 0; i < indexList.size();i++){ pairList.add(new Pair(indexList.get(i), valueList.get(i))); } int sum = 0; int min = -1; int max = -1; for(int i = 0; i < pairList.size(); i++){ Pair p = pairList.get(i); if(sum == 0){ min = p.key; max = p.key; } sum += p.value; if(sum < LIMIT){ max = p.key; } else { if(sum > LIMIT){ i--; } else { max = p.key; } System.out.println(min+"_"+max); sum = 0; } } } 

哪个印刷品:

 23_32 43_43 45_56 

我将向您展示如何通过地图创建对列表(使用LinkedHashMap保留插入顺序)(显然,您需要稍微修改Pair类):

 Map m = new LinkedHashMap<>(); //fill your map here List l = new ArrayList<>(); for(Map.Entry entries : m.entrySet()){ l.add(new Pair(entries.getKey(), entries.getValue())); } //Now you have a list of Pair