根据特定条件拆分地图

时间:2014-01-28 16:08:26

标签: 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 +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的键将被选为最小值和最大值。

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

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

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

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

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

在我以这种格式获取数据时进行检查

abcObjectsList= ArrayList<E>
     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<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

1 个答案:

答案 0 :(得分:2)

您可以创建一个保存密钥和值的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. 总和不等于限制(因此它更优),减少索引并且不更新最大键

  3. 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
    

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

    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