Итерация и расчет чисел на карте - PullRequest
0 голосов
/ 02 июня 2010

У меня есть карта списков с ключом = GROUP и значением = списком номеров, хранящихся в виде строк. Один элемент ниже

GROUP1/[3.0, 4.0, 2.0, 3.0, 3.0, 2.0, 2.0, 2.0, 2.0, -2.0, -2.0, -2.0, 2.0]

Что мне нужно сделать, это отменить (удалить) все отрицательные числа против положительных, но уменьшить числа + ve на это значение.

В вышеприведенном примере 3 отменяется против -2 (первый-пятый), оставляя +1 как промежуточный итог

Тогда +1 (общее от предыдущего) отменит -2 (следующий -ve), оставив -1 в качестве промежуточного итога

-1 должен возводиться в квадрат против 4 (следующий + ve в списке), оставляя 3 как промежуточный итог

Затем 3 квадрата против -2 (следующий-ве), оставляя в общей сложности 1.

Таким образом, все -ve исключены из Списка, равно как и 3.0, 4.0, но первый элемент теперь равен 1.0 (1.0 является последним промежуточным итогом)

Конечная последовательность:

[1.0, 2.0, 3.0, 3.0, 2.0, 2.0, 2.0, 2.0, 2.0]

Код, который у меня есть, просто суммирует список, как показано ниже.

Map<String, List<String>> m = new HashMap<String, List<String>>();

...

for (Entry<String, List<String>> entry : m.entrySet()) 
{ 
  System.out.println(entry.getKey() + "/" + entry.getValue()); 
  double calc = 0;
  for (String element:entry.getValue()){
      //System.out.println(element);
      calc = calc + new Double(element).doubleValue();

  }
  //if (calc > 0.0)
      System.out.println("Total for Item: " + entry.getKey() + " is "+calc);
} 

Итого за товар: GROUP1 составляет 19,0

Я знаю, что мы не должны удалять элементы из списка во время итерации, поэтому вопрос

A) Идеальная логика для удаления чисел в указанной выше последовательности.

B) Должен ли я создать новый список и добавить в него элементы во время итерации?

C) Должен ли я изменить коллекцию, которую я храню, с Map of Lists на какую-то структуру классов?

1 Ответ

2 голосов
/ 02 июня 2010

Я думаю, что самое простое решение - повторить список дважды, вытащить отрицательные числа на первых итерациях, а затем настроить оставшиеся числа на второй итерации. Если нет необходимости сохранять исходное состояние карты, то я бы все сделал на месте, хотя я не уверен, почему вы думаете, что вы меняете карту во время итерации, поскольку в вашем коде нет ничего, что делает это (если это опечатка и ты имел ввиду список).

Что касается типа коллекции, я думаю, что главный вопрос в том, какой тип производительности вам нужен для различных операций по сравнению с размером / типом данных. Ниже приведена реализация алгоритма, который я описал выше. Поскольку это может потенциально сделать много удалений (в зависимости от ваших данных), может быть лучше, если списки являются списками LinkedLists, поскольку они могут выполнять удаление в постоянное время. Конечно, вы всегда можете выполнить эти вычисления с LinkedLists, а затем сделать копию данных другого типа, например ArrayList, если вам нужна более высокая производительность для индексированного доступа.

Как я уже говорил, здесь есть реализация, использующая двухпроходный подход. Примечание. Я не удаляю нулевые значения, а в конце вставляю одно отрицательное значение, если итоговое значение является отрицательным (не знаю, какие у вас требования в этом случае):

for (Entry<String, List<String>> entry : m.entrySet()){ 
  System.out.println(entry.getKey() + "/" + entry.getValue()); 
  double calc=0,acc = 0, item;
  //First look for negative values
  for (Iterator<String> it=entry.getValue().iterator();it.hasNext();){
    item = Double.parseDouble(it.next());
    calc += item;
    if(item < 0){
      //accumulate them, and remove them from the list
      acc += item;
      it.remove();
    }
  }
  if(calc > 0){
    //now adjust the remaining positive numbers
    for (Iterator<String> it=entry.getValue().iterator();it.hasNext();){
      item = Double.parseDouble(it.next());
      //remove the number as we adjust it if it
      //is the last positive it will be reinserted
      //when the loop breaks
      it.remove();
      if((acc+=item) >= 0){
        //the accumulated numbers are now positive
        break;
      }
    }
    //re-insert the adjusted positive back into the list
    entry.getValue().add(0, Double.toString(acc));
  }else{
    //the total sum was negative or zero
    entry.getValue().clear();
    entry.getValue().add(Double.toString(calc));
  }
  System.out.println("Total for Item: " + entry.getKey() + " is "+calc);
  System.out.println("List is now: "+entry.getValue());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...