2014-01-29 2 views
0

У меня есть карта, как показано ниже:извлечение данных из списка в определенном состоянии

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 
    43  50 ****so how we will handle the case where value is greater than   key 50 >43 ********   

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

1), где значение стоимости карты достигает 40 2) где значение карты при расчете становится больше 40

3) ** не реализовали сценарий, в котором первый экземпляр, где значение карты на начальном уровне больше в первом экземпляре, можно сказать, как показано вышеключ 43, а значение 50 * *

Теперь, пожалуйста, посоветуйте, как обрабатывать третий сценарий, то, что я реализовал это .. создать 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) { 
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 
    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 

Можете ли вы посоветовать, как обращаться третий сценарий, в котором первый случай, когда значение карты на начальном уровне больше в первую очередь скажем, как показано выше, ключ 43, а значение 50 * *

+0

Как обратная ссылка для других, которые пытаются понять, о чем идет речь: http://stackoverflow.com/questions/21410808/splitting-a-map-based-on-certain-condition – Marco13

ответ

0

Вы все еще не указали ясно, чего вы собираетесь достичь. Вы не сказали, находятся ли ключи вашей входной карты в порядке возрастания (то есть, является ли это TreeMap). В исходном вопросе (связанный в первом комментарии) ваш ввод был 2 списком. Пример, который вы опубликовали, не имеет никакого смысла, потому что он содержит ключ = 43 дважды - так что это не может быть карта. Ваше описание звучит так, будто между ключами и значениями есть некоторое ограничение (значение 50 больше, чем ключ 43), но, возможно, это просто артефакт вашего объяснения.

Ваш подход к решению и то, как вы обновили некоторые переменные в своей реализации, может быть попыткой предоставить точную информацию. Но, возможно, словесное или полуформальное описание вашего действительного цели более полезно здесь. Может быть, вы просто не можете объяснить, чего вы хотите достичь. В худшем случае, вы не знать это.

В настоящий момент моя интерпретация выглядит примерно так: Ваш вход состоит из двух списков (!). И вы пытаетесь найти диапазоны первого списка, так что сумма соответствующих значений во втором списке составляет не менее 40.

Если это так, вы можете просто вычислить индексы для списка значений, где должно начинаться суммирование и где суммирование должно заканчиваться. Когда у вас есть эти индексы, вы можете получить соответствующие «ключи» из первого списка.

import java.util.ArrayList; 
import java.util.List; 

public class SumSplit 
{ 
    public static void main(String[] args) 
    { 
     List<Integer> keys = new ArrayList<Integer>(); 
     keys.add(23); 
     keys.add(32); 
     keys.add(43); 
     keys.add(45); 
     keys.add(47); 
     keys.add(56); 
     keys.add(43); 

     List<Integer> values = new ArrayList<Integer>(); 
     values.add(20); 
     values.add(20); 
     values.add(18); 
     values.add(24); 
     values.add(10); 
     values.add(6); 
     values.add(50); 

     final int SPLIT_VALUE = 40; 

     List<Integer> minIndices = new ArrayList<Integer>(); 
     List<Integer> maxIndices = new ArrayList<Integer>(); 

     int sum = 0; 
     int minIndex = -1; 
     for (int i=0; i<keys.size(); i++) 
     { 
      Integer value = values.get(i); 
      sum += value; 

      if (minIndex == -1) 
      { 
       minIndex = i; 
      } 
      if (sum >= SPLIT_VALUE) 
      { 
       minIndices.add(minIndex); 
       maxIndices.add(i); 
       minIndex = -1; 
       sum = 0; 
      } 
     } 


     for (int i=0; i<minIndices.size(); i++) 
     { 
      Integer min = minIndices.get(i); 
      Integer max = maxIndices.get(i); 
      System.out.println("min: "+keys.get(min)+", max "+keys.get(max)); 
      printInfo(min, max, keys, values); 
     } 
    } 

    private static void printInfo(int min, int max, List<Integer> keys, List<Integer> values) 
    { 
     int sum = 0; 
     for (int i=min; i<=max; i++) 
     { 
      Integer key = keys.get(i); 
      Integer value = values.get(i); 
      sum += value; 
      System.out.println(" "+key+" : "+value+" (sum until now: "+sum+")"); 
     } 
     System.out.println("Sum: "+sum); 
    } 
} 

Если это не то, что вы собираетесь достичь, пожалуйста, опишите четко, что фактическая цель состоит в том.