当前位置: 首页 > 面试题库 >

根据特定条件分割地图

拓拔松
2023-03-14
问题内容

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

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条件中获取列表,如下所示…

  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

问题答案:

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

class Pair {
    public int key;
    public int value;

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

然后创建一个配对列表并对其进行迭代。如果总和为0,则初始化最小值和最大值。然后对于每个迭代的对,将其值加到总和上。如果总和小于,请继续循环并更新max键,否则可能出现两种情况:

  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

我将向您展示如何通过地图创建一个配对列表(使用a 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


 类似资料:
  • 问题内容: 我有一个包含各种字符串值的列表。我想一看就拆分列表。结果将是一个列表列表(这将是原始列表的子列表),其中仅包含I的一个实例,我可以使用循环执行此操作,但是有没有 更Python的 方法可以实现此目的? 例子= 结果= 这是我尝试过的方法,但实际上并没有达到我想要的效果,因为它将放入应包含的其他列表中: 问题答案: 我会使用发电机: 此打印 该代码接受任何可迭代的代码,并生成一个可迭代的

  • 我以前使用Netlogo,有一些非常好的内置方法,允许我从总人口中筛选和控制所需的代理。(见:http://ccl.northwestern.edu/netlogo/docs/dictionary.html#agentsetgroup).例如,我可以很容易地用简单的代码在模拟中命令不同级别的人员代理,例如: 在Repast中,是否有专门为方便控制代理集而构建的方法列表?

  • 我用AnyLogic创建了一个简单的模型(见截图)。现在我想添加一个条件,选择服务块中的两个资源集中的一个。例如,以下场景应适用:如果队列中有5个以上的部件,工作人员3和工作人员4应执行服务。如果有的话

  • 问题内容: 从美学角度和性能角度来看,基于条件将项目列表拆分为多个列表的最佳方法是什么?相当于: 有没有更优雅的方法可以做到这一点? 更新:这是实际的用例,以更好地解释我正在尝试做的事情: 问题答案: 有没有更优雅的方法可以做到这一点? 该代码完全可读,而且非常清晰! 再次,这很好! 使用集合可能会稍微改善性能,但这是微不足道的差异,而且我发现列表理解要容易阅读得多,并且你不必担心顺序被弄乱了,重

  • 给定任务:“编写名为‘mysplit’的函数,该函数获取一个int数组并调用一个名为‘mysplit’的递归方法。函数mysplit需要检查当前数组是否可以分为以下两组: *每组的总和必须相等。 *每个数字在每个组中只出现一次(此子句旨在防止用户添加/复制数字,以获得两个组之间的相等值=第一个子句)。 *所有可以除以5的数字必须在同一组。 *所有能被3(而不是5)除以的数字必须在第二组中。 我已经

  • sql如果有重复数据,怎么根据需要去重,比如no相同,优先保留code为b的 五条数据四条code a 一条code b 其中code b的no和code a重复了,最后应该是四条数据,其中三条code a一条code b