我有一张如下图所示的地图:
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
答案 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,则初始化最小值和最大值。然后对于迭代的每一对,将其值添加到总和。如果总和较差,则继续循环并更新最大密钥,否则您有两种情况:
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