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