2010-06-02 3 views
0

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

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] 

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

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

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

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

Затем, 3 квадраты с против -2 (следующего -ve), оставляя в общей сложности 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

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

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

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

C) Должен ли я изменить коллекцию, которую я храню из Карты списков, в некоторую структуру классов?

ответ

2

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

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

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

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()); 
} 
+0

Благодарности - придется переваривать ответить на немного. Измените опечатку об удалении с карты. – shinynewbike