2014-09-06 5 views
1

많은 개체가있는 ArrayList가 있습니다. 같은 속성 이름의 합계를 원합니다.클래스 개체의 합계 값 ArrayList에있는 속성

 "Michel" ,7000 
     "Alex" , 8000 
     "Edvin" , 4000 
     "Sosha" , 3000 

로직 클래스 ProfitAndLossDataDO - ProfitAndLossDataDO

 "Michel" , 5000 
     "Alex" , 5000 
     "Edvin" , 4000 
     "Sosha" , 3000 
     "Michel" , 2000 
     "Alex" , 3000 

의 목적이며, (사용자가 동일한 경우의 값의 합) 결과 일 것이다 Array List

예 데이터

public class ProfitAndLossDataDO { 

String ledgerName; 
double ledgerAmount; 

public ProfitAndLossDataDO() { 
} 

public ProfitAndLossDataDO(String ledgerName, double ledgerAmount) { 
    this.ledgerName = ledgerName; 
    this.ledgerAmount = ledgerAmount; 
} 



public String getLedgerName() { 
    return ledgerName; 
} 

public void setLedgerName(String ledgerName) { 
    this.ledgerName = ledgerName; 
} 

public double getLedgerAmount() { 
    return ledgerAmount; 
} 

public void setLedgerAmount(double ledgerAmount) { 
    this.ledgerAmount = ledgerAmount; 
} 


@Override 
public String toString() 
{ 
      return ("ledger name : "+this.getLedgerName()+" Amount : "+this.getLedgerAmount()); 
} 
} 

감사합니다.

+0

문제점 : – Eran

+0

@Eran은 합계를 찾을 수 없습니다 –

답변

2

나는 목록을 반복하고지도에 결과를 수집하는 것 : aleroot이 제안

public static List<ProfitAndLossDataDO> sumPerLedgerName 
    (List<ProfitAndLossDataDO> list) { 

    Map<String, ProfitAndLossDataDO> map = new HashMap<>(); 

    for (ProfitAndLossDataDO p : list) { 
     String name = p.getLedgerName(); 
     ProfitAndLossDataDO sum = map.get(name); 
     if (sum == null) { 
      sum = new ProfitAndLossDataDO(name, 0.0); 
      map.put(name, sum); 
     } 
     sum.setLedgerAmount(sum.getLedgerAmount() + p.getLedgerAmount()); 
    } 
    return new ArrayList<ProfitAndLossDataDO>(map.values()); 
} 
+0

정말 고마워요 ... –

2

키/값 쌍이있는지도 기반 컬렉션에 넣지 않는 이유는 무엇입니까?

나는이 경우 맵 기반 컬렉션이 더 적합하다고 생각한다. 당신이 가지고있는 데이터와 그것을 사용하고자하는 맥락이다.

목록 안의 단일 항목을 유지해야하는 경우 연결된 목록을지도의 값으로 사용할 수 있습니다.

예를 들어

:

HashMap<String, LinkedList<Double>> cache = new HashMap<String, LinkedList<Double>>(); 

및 총 금액을 찾기 위해 값 LinkedList의 각 요소를 SUM ... 당신도 (getTotal 같은 도우미 기능을 가진 컨테이너 객체로 두 배의 LinkedList의 포장 수) 또는 합집합().

+0

오 키는 유니버스 값만 삽입하여 해시를 사용합니다. 하지만 어떻게 이러한 가치를 얻을 수 있을까요? 몇 가지 작은 예제를 보여주십시오 –

+0

더 자세한 설명을 찾을 수있는 업데이트 된 답변을보세요 – aleroot

+0

도움을 주셔서 감사합니다 ... 나는 그것을 얻습니다 ... –

2

당신은 해시지도를 사용할 수 있습니다. 이름을 키로 사용하고 합계를 값으로 사용하십시오. 값을 삽입해야 할 때마다 같은 키가있는 항목을 확인하고 업데이트하십시오.

public class ProfitAndLossDataDO { 

HashMap<String, Double> data = new HashMap<String, Double>(); 

public ProfitAndLossDataDO() { 

} 

public void updateLedger(String ledgerName, double ledgerAmount) { 
    double temp; 
    if(data.containsKey(ledgerName)) { 
     temp = data.get(ledgerName)+ledgerAmount; 
     data.put(ledgerName,temp); 
    } 
    else { 
     data.put(ledgerName,ledgerAmount); 
    } 

} 
}