Somatório de um list

9 respostas
E

Galera o seguinte, recebo um List em que tenho que somar os valores da transações por terminal e por data de cada terminal…

Por exemplo:

Terminal 1

DataIgual1 valor1
DataIgual1 valor1
DataIgual2 valor2
Dataigual2 valor2

Total por DataIgual1: valor1+valor1;

Total por DataIgual2: valor2+valor2;

Total por Terminal: Total por DataIgual1  + Total por DataIgual2;

Por gentileza, me ajudem pelo menos nessa…

Valeu !

9 Respostas

E

será que tenho que utilizar hasmap ?

sergiotaborda

sim. Utilize o cirtério de agrupamento como chave e o numero como valor.

T

Obs: Código em C# 3.0 (Visual Studio 2008)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Linq;

namespace WindowsFormsApplication1
{
    class Transacao
    {
        public long Id { get; set; }
        public string Terminal { get; set; }
        public DateTime Data { get; set; }
        public decimal Valor { get; set; }
        public Transacao(long id, string terminal, DateTime data, decimal valor)
        {
            Id = id; Terminal = terminal;  Data = data; Valor = valor;
        }
        public override string ToString()
        {
            return String.Format("{0} - {1} - {2:d} - {3:C}",
                Id, Terminal, Data, Valor);
        }
    }

    
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var transacoes = new List<Transacao>() {
                new Transacao(1, "terminal 1", new DateTime(2008, 12, 1), 200.00m),
                new Transacao(2, "terminal 1", new DateTime(2008, 12, 2), 400.00m),
                new Transacao(3, "terminal 2", new DateTime(2008, 12, 2), 700.00m),
                new Transacao(4, "terminal 2", new DateTime(2008, 12, 3), 800.00m),
                new Transacao(5, "terminal 1", new DateTime(2008, 12, 3), 800.00m)
            };
            Console.WriteLine("==== Transações Agrupadas Por Data ====");
            var transacoesAgrupadasPorData = from t in transacoes
                                             group t by t.Data into grupoPorData
                                             orderby grupoPorData.Key
                                             select grupoPorData;
            foreach (var g in transacoesAgrupadasPorData)
            {
                Console.WriteLine("--- Data : {0:d} ---", g.Key);
                foreach (var t in g)
                {
                    Console.WriteLine(t);
                }
                Console.WriteLine ("Soma = {0:C}", g.Sum(t => t.Valor));
            }
            Console.WriteLine("==== Transações Agrupadas Por Terminal ====");
            var transacoesAgrupadasPorTerminal = from t in transacoes
                                                 group t by t.Terminal into grupoPorTerminal
                                                 orderby grupoPorTerminal.Key
                                                 select grupoPorTerminal;
            foreach (var g in transacoesAgrupadasPorTerminal)
            {
                Console.WriteLine("--- Terminal : {0:d} ---", g.Key);
                foreach (var t in g)
                {
                    Console.WriteLine(t);
                }
                Console.WriteLine("Soma = {0:C}", g.Sum(t => t.Valor));
            }
        }
    }
}

Saída esperada:

==== Transações Agrupadas Por Data ====
--- Data : 01/12/2008 ---
1 - terminal 1 - 01/12/2008 - R$ 200,00
Soma = R$ 200,00
--- Data : 02/12/2008 ---
2 - terminal 1 - 02/12/2008 - R$ 400,00
3 - terminal 2 - 02/12/2008 - R$ 700,00
Soma = R$ 1.100,00
--- Data : 03/12/2008 ---
4 - terminal 2 - 03/12/2008 - R$ 800,00
5 - terminal 1 - 03/12/2008 - R$ 800,00
Soma = R$ 1.600,00
==== Transações Agrupadas Por Terminal ====
--- Terminal : terminal 1 ---
1 - terminal 1 - 01/12/2008 - R$ 200,00
2 - terminal 1 - 02/12/2008 - R$ 400,00
5 - terminal 1 - 03/12/2008 - R$ 800,00
Soma = R$ 1.400,00
--- Terminal : terminal 2 ---
3 - terminal 2 - 02/12/2008 - R$ 700,00
4 - terminal 2 - 03/12/2008 - R$ 800,00
Soma = R$ 1.500,00
T

Agora entendi por que é que as pessoas usam SQL - se eu fosse fazer o mesmo código com System.Collection.Generics puro em em vez de LINQ, iria ter de lutar com hashmaps (embora nesse caso o tipo indicado fosse um TreeMap).

sergiotaborda

thingol:
Agora entendi por que é que as pessoas usam SQL - se eu fosse fazer o mesmo código com System.Collection.Generics puro em em vez de LINQ, iria ter de lutar com hashmaps (embora nesse caso o tipo indicado fosse um TreeMap).

Voce pode subsituir o LINQ por um QueryObject com interface fluente e o codigo de pesquisas colocar em algum objeto utilitário ( ou num Reporitorio ou no proprio QueryObject)

E

Cara vou implementar agora, de qualquer forma eu já agradeço pela atençao…

E

O exemplo do colega interessante, mas não consegui fazer em java…Se alguém pude esclarecer, eu agradeço.

E

Galera, eu populei os dados afim que possa facilicitar o entendimento daqueles que podem me ajudar.

Esse código coloquei o metódo main em branco somente recebendo a lista de dados para ser implementando segundo as sugestões de vocês.

O que eu preciso ?

Ordenar os meus dados por terminal e por data por exemplo:

package padrao;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;



public class Tratador {
	
	class Dado{
		
		private String terminal;
		private String data;
		private Long agencia;
		private Long conta;
		private Integer via;
		private BigDecimal valor;
		
		public String getTerminal() {
			return terminal;
		}
		public void setTerminal(String terminal) {
			this.terminal = terminal;
		}
		public String getData() {
			return data;
		}
		public void setData(String data) {
			this.data = data;
		}
		public Long getAgencia() {
			return agencia;
		}
		public void setAgencia(Long agencia) {
			this.agencia = agencia;
		}
		public Long getConta() {
			return conta;
		}
		public void setConta(Long conta) {
			this.conta = conta;
		}
		public Integer getVia() {
			return via;
		}
		public void setVia(Integer via) {
			this.via = via;
		}
		public BigDecimal getValor() {
			return valor;
		}
		public void setValor(BigDecimal valor) {
			this.valor = valor;
		}
		
		
	}
	public List<Dado>retornoConsulta(){
		
		List<Dado>listDados = new ArrayList<Dado>();
		
		
		//1 dado:
		Dado dado1 = new Dado();
		dado1.setAgencia(new Long(128));
		dado1.setConta(new Long(6029));
		dado1.setData("01/01/2008");
		dado1.setVia(new Integer(0));
		dado1.setTerminal("1");
		dado1.setValor(new BigDecimal(100));
		
		//2 dado:
		Dado dado2 = new Dado();
		dado2.setAgencia(new Long(128));
		dado2.setConta(new Long(6029));
		dado2.setData("12/10/2007");
		dado2.setVia(new Integer(0));
		dado2.setTerminal("1");
		dado2.setValor(new BigDecimal(200));
		
		//3 dado:
		Dado dado3 = new Dado();
		dado3.setAgencia(new Long(128));
		dado3.setConta(new Long(6029));
		dado3.setData("12/10/2007");
		dado3.setVia(new Integer(0));
		dado3.setTerminal("1");
		dado3.setValor(new BigDecimal(300));
		
		//4 dado:
		Dado dado4 = new Dado();
		dado4.setAgencia(new Long(128));
		dado4.setConta(new Long(6029));
		dado4.setData("12/10/2007");
		dado4.setVia(new Integer(0));
		dado4.setTerminal("1");
		dado4.setValor(new BigDecimal(500));
		
		//5 dado:
		Dado dado5 = new Dado();
		dado5.setAgencia(new Long(128));
		dado5.setConta(new Long(6029));
		dado5.setData("12/10/2007");
		dado5.setVia(new Integer(0));
		dado5.setTerminal("2");
		dado5.setValor(new BigDecimal(200));
		
		//6 dado:
		Dado dado6 = new Dado();
		dado6.setAgencia(new Long(128));
		dado6.setConta(new Long(6029));
		dado6.setData("12/10/2007");
		dado6.setVia(new Integer(0));
		dado6.setTerminal("2");
		dado6.setValor(new BigDecimal(400));
		
		//7 dado:
		Dado dado7 = new Dado();
		dado7.setAgencia(new Long(128));
		dado7.setConta(new Long(6029));
		dado7.setData("25/11/2007");
		dado7.setVia(new Integer(0));
		dado7.setTerminal("2");
		dado7.setValor(new BigDecimal(400));
		
		//8 dado:
		Dado dado8 = new Dado();
		dado8.setAgencia(new Long(128));
		dado8.setConta(new Long(6029));
		dado8.setData("25/11/2007");
		dado8.setVia(new Integer(0));
		dado8.setTerminal("2");
		dado8.setValor(new BigDecimal(400));
		
		listDados.add(dado1);
		listDados.add(dado5);
		listDados.add(dado6);
		listDados.add(dado7);
		listDados.add(dado8);
		listDados.add(dado4);
		listDados.add(dado3);
		listDados.add(dado2);
		
		
		return listDados;
	}
	
	
	public static void main(String[] args) {
		
		List<Dado>listaDados = new Tratador().retornoConsulta();
		
		
		
	}
}
E

Existe solução para isso, alguém já lidou com esse problema ou é um problema totalmente fora do comum ? Trechos de códigos, idéia, tudo é valido galera. Se eu tivesse com o tempo para solucionar, iria estudar tudo sobre collections parte por parte aprender, mas preciso resolver imediatamente, por isso estou recorrendo a ajuda de vocês…

Mais uma vez eu agradeço.

Criado 16 de maio de 2008
Ultima resposta 20 de mai. de 2008
Respostas 9
Participantes 3