【问题标题】:Splitting a map based on certain condition根据特定条件拆分地图
【发布时间】:2014-01-29 02:10:19
【问题描述】:

我有一张如下图:

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.

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

除此之外,如果 sum 超过 40,则需要注意。如果是这样,我们必须忽略它,并在 min 和 max 相等的情况下将先前的值本身作为 min 和 max。

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

我正在获取的数据不是来自数据库,而是从对象列表中的休眠条件获取的数据

我正在从 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

【问题讨论】:

  • 不,这不是同一个问题,请提供解决方案
  • @user1694073 你试过什么?你被困在哪里了?
  • @ZouZou 我被这个问题困住了,请您提供解决方案。
  • 我已经用更好的语法和句法编辑了您的问题,以帮助读者。如果您觉得我改变了某些部分的范围或含义,请随时还原它们!

标签: java


【解决方案1】:

您可以创建一个Pair 类来保存键和值,而不是使用映射。

class Pair {
    public int key;
    public int value;

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

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

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

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

【讨论】:

  • 您能否查看更新后的帖子,其中我展示了我如何获取数据并最终将其存储在地图中,我们必须从这张地图中完成这个过程。
  • @user1694073 你知道如何做到这一点。这与 Map 的过程完全相同(您必须使用 LinkedHashMap 来代替迭代时保留插入顺序)。
  • 我认为您的程序现在会发生最轻微的变化,我们必须删除我们说我们正在从您的代码中的数据库中获取列表的部分
  • @user1694073 你有一个Map&lt;Long, Integer&gt; 而不是Pair(int ,int)。没有太大变化,因为每个键/值对都对应于我定义的 Pair 类。你被困在哪里了?
  • 能否请您更新您的主要方法,以便我可以清楚地掌握更新的更改提前谢谢。
猜你喜欢
  • 2019-08-18
  • 1970-01-01
  • 1970-01-01
  • 2023-02-16
  • 1970-01-01
  • 1970-01-01
  • 2017-06-17
  • 2010-10-31
  • 1970-01-01
相关资源
最近更新 更多