2014-01-28 2 views
-1

У меня есть карта, как показано ниже:Разбиваем карту на основе определенного условия

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 

Как вы можете видеть, будет окончательным константу под названием раскол, значение которого 40

final int SPLIT = 40; //this will be configurable as it value can be changed. 

У меня есть для реализации логики, например, если значение карты достигает 40, , тогда первый ключ карты, с которой начинается расчет, и ключ, где он достигает до 40, будет также выбран как min и max, как объяснялось выше.

Кроме того, необходимо соблюдать осторожность, если сумма достигает более 40. Если это так, мы должны игнорировать ее и принимать предыдущее значение как min и max в случае, когда min и max были бы равны.

Просьба предложить мне, как я могу достичь этого с помощью Java и Map. люди, пожалуйста, сообщите

данные, которые я geeting не из базы данных я geeting его из критериев 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 

Я сохранил его в карте таким образом, как я требовать его же Fashi на

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

возможно дублировать [Извлечение содержимого ита и динамическое выполнение вычислений] (http://stackoverflow.com/questions/21409397/extracting-the-contents-of-the-ist-and-dynamically-doing-coolculations) – user2336315

+0

no this это не тот же вопрос, который задают, пожалуйста, сообщите об этом решении – user1694073

+0

@ user1694073 Что вы пробовали? Где вы застряли? –

ответ

2

Вместо того, чтобы использовать карту, вы можете создать Pair класс, который будет содержать ключ и значение.

class Pair { 
    public int key; 
    public int value; 

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

Затем создайте список пар и проведите через него. Если сумма равна 0, инициализируйте min и 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 

Я покажу вам, как создать список пар через карту (используйте 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 
+0

вы можете увидеть обновленное сообщение, в котором я показал, как я извлекаю данные и, наконец, сохраняю их на карте и с этой карты, мы должны выполнить этот процесс. – user1694073

+0

@ user1694073 У вас есть идея, как это сделать. Это точно такой же процесс с картой (вам придется использовать «LinkedHashMap» вместо этого, чтобы сохранить порядок вставки при итерации). –

+0

Я думаю, что малейшее изменение будет происходить в вашей программе сейчас, где мы должны удалить часть, которую мы говорим, что мы извлекаем список из базы данных в ваш код. – user1694073

Смежные вопросы