Java 基于特定条件拆分地图

Java 基于特定条件拆分地图,java,Java,我有一张地图,如下所示: 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 +

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

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,则需要小心。如果是这样,我们必须忽略它,在最小值和最大值相等的情况下,将前一个值本身作为最小值和最大值

请建议我如何使用Java和
Map
实现这一点。请各位指教

我正在查找的数据不是来自数据库,而是来自对象列表中的hibernate条件

我从Hibernate标准中得到一个列表,如下所示

  List<Object[]> abcObjectsList= session.createCriteria(dddObject.class) 

您可以创建一个包含键和值的
类,而不是使用映射

class Pair {
    public int key;
    public int value;

    public Pair(int key, int value){
        this.key = key;
        this.value = value;
    }
}
然后创建一个pair列表并遍历它。如果总和为0,则初始化最小值和最大值。然后对于迭代的每一对,将其值添加到总和中。如果总和较低,则继续循环并更新max键,否则可能有两种情况:

  • 总和等于限制,因此更新max键
  • 总和不等于限制(因此它更高),减少索引,不更新max键

  • 我向您展示了如何通过map创建pair列表(使用
    LinkedHashMap
    保留插入顺序)(显然,您需要稍微修改
    pair
    类):

    Map m=newlinkedhashmap();
    //把地图填在这里
    列表l=新的ArrayList();
    对于(Map.Entry条目:m.entrySet()){
    l、 添加(新对(entries.getKey(),entries.getValue());
    }
    //现在您有了一个配对的列表
    
    可能重复“否”这与所问的问题不同,请告知solution@user1694073你试过什么?你被困在哪里?@ZouZou我被困在这个问题上,你能告诉我解决方法吗?我用更好的语法和语法编辑了你的问题,以帮助读者。如果您觉得我更改了某些部分的范围或含义,请随时恢复它们!你能看一下更新后的帖子吗?在这篇帖子中,我展示了如何获取数据并最终将其存储在地图中,我们必须从这张地图中执行此过程。@user1694073你知道如何执行此操作。这与映射的过程完全相同(你必须使用
    LinkedHashMap
    ,以在迭代时保留插入顺序)。我认为你的程序现在会发生最轻微的变化,当我们说要从您的数据库中获取列表时,我们必须删除该部分code@user1694073您有一个
    Map
    而不是
    对(int,int)
    。没有太多变化,因为每个键/值对都对应于我定义的pair类。你被困在哪里了?然后你能更新你的主要方法吗?这样我就可以清楚地掌握更新的变化,谢谢提前。
      Map<Long, Integer> result = new HashMap<Long, Integer>();
                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
    
    class Pair {
        public int key;
        public int value;
    
        public Pair(int key, int value){
            this.key = key;
            this.value = value;
        }
    }
    
    public static void main(String[] arg) {
        List<Integer> indexList = Arrays.asList(23,32,43,45,47,56,49,47); // get this from database
        List<Integer> valueList = Arrays.asList(20,20,18,24,10,6,2,12); // get this from database
        List<Pair> 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
    
    Map<Long, Integer> m = new LinkedHashMap<>();
    //fill your map here
    List<Pair> l = new ArrayList<>();
    for(Map.Entry<Long, Integer> entries : m.entrySet()){
        l.add(new Pair(entries.getKey(), entries.getValue()));
    }
    //Now you have a list of Pair