2010-06-02 5 views
0

키가있는 목록의지도 = 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] 

아래 한 요소이다. 위의 예에서

3은 +1로 떠나 대하여 -2 (제 -ve) 오프 취소 될 임시 합계

이어서 +1 (이전의 합계) 오프 취소한다 -2 (다음 -ve) 이탈 -1 중간 총

-1 이탈 (+ 목록에서 다음 적이) 4

이어서 전체 임시로 떠나 3에 대하여 제곱 대 -2 (다음 -ve) 오프하는 3 제곱 총계는 1입니다.

따라서 all -ve는 List에서 제거되므로 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 그래서 질문은

A는, 나는 우리가 반복으로 우리가 목록에서 요소를 제거하지 말아야 알고있다 19.0

입니다) 위의 시퀀스에서 숫자를 제거하기위한 이상적인 논리.

B) 반복 할 때 새 목록을 만들고 요소를 추가해야합니까?

C) List of Map에서 일부 클래스 구조로 저장하는 콜렉션을 변경해야합니까?

답변

2

가장 간단한 해결책은 목록을 두 번 반복하고, 첫 번째 반복에서 음수를 추출한 다음 두 번째 반복에서 나머지 수를 조정하는 것입니다. 원래 맵 상태를 유지할 필요가 없다면 모든 것을 그 자리에서 수행 할 것입니다. 그러나 반복하지 않는 한 왜 맵을 변경한다고 생각하는지 확신 할 수 없습니다. 그렇게하지 않는 한 코드에는 아무 것도 없습니다. 오타이고 목록을 의미했습니다).

컬렉션 유형에 관해서는 주된 질문은 데이터의 크기/유형 대 다양한 작업에 필요한 성능 유형입니다. 아래는 위에서 설명한 알고리즘의 구현입니다. 이 작업은 잠재적으로 데이터에 따라 제거 작업을 많이 수행 할 수 있으므로 List가 LinkedLists 인 경우 일정 시간 내에 제거를 수행 할 수 있으므로 더 좋을 수 있습니다. 물론 LinkedLists를 사용하여 이러한 계산을 수행 한 다음 인덱싱 된 액세스 성능을 향상시킬 필요가있는 경우 ArrayList와 같은 다른 유형의 데이터 사본을 만들 수 있습니다.

앞에서 설명한 것처럼 2 단계 접근법을 사용하는 구현이 있습니다.전체가 음 (당신의 requriements이 경우에 확실하지) 인 경우 I는 0 값을 제거하지 않고, 마지막에이 하나의 음의 값을 삽입 참고 :

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

감사합니다 - 답변 a를 소화해야 비트. 지도에서 제거하는 것에 대해 오타를 편집합니다. – shinynewbike