Agrupar Objetos num list[RESOLVIDO]

5 respostas
L

Pessoal…
Estou com uma dúvida…

Por exemplo…
Tenho um List com um array de strings dentro com duas posições assim
List<String[]>…

onde o seu conteúdo seria por exemplo assim… na primeira posicao do string seria um cabeçalho e no segundo seria um numero representando quantidades

String{“A110” , “1”}, //Posição 0 do list
String{“A111” , “5”}, //Posição 1 do list
String{“A111” , “1”}, //Posição 2 do list
String{“A111” , “2”}, //Posição 3 do list
String{“A999” , “3”}, //Posição 4 do list

Então como faço para agrupar estes registros somando as quantidades…tipo o resultado teria que ficar assim

String{“A110” , “1”}, //Posição 0 do list
String{“A111” , “8”}, //Posição 1 do list
String{“A999” , “3”}, //Posição 2 do list

Pensei e criar um List temporario , depois excluir os repetidos, depois comparar com o array original, mas creio que assim daria muito processamento, já que esse list poderá ser de umas 2000 posições…

5 Respostas

E

Naõ use um List<String[]> e sim um Map<String, Integer>, onde a chave (key) é por exemplo “A110” e o valor (value) é a contagem, no caso 8.

Vinicius_Zibetti_Res

Caso não opite pelo Map, segue uma pequena solução para o seu problema, talves tenha resolvido, se n tiver erros de compilação ou de logica:

Ps: Altamente aconselhavel usar Map nesse caso.
import java.util.*;

public class Test {
	private List<String[]> list = new LinkedList<String[]>();

	public static void main(String[] args) {
		Test sh = new Test();
		sh.list.add(new String[] { "A110", "1" });
		sh.list.add(new String[] { "A111", "5" });
		sh.list.add(new String[] { "A111", "1" });
		sh.list.add(new String[] { "A111", "2" });
		sh.list.add(new String[] { "A999", "3" });
		List<String[]> aux = new LinkedList<String[]>();
		boolean[] flags = new boolean[sh.list.size()];
		for (int i = 0; i < sh.list.size(); ++i) {
			if (!flags[i]) {
				String[] temp = { sh.list.get(i)[0], sh.list.get(i)[1] };
				for (int j = 0; j < sh.list.size(); j++) {
					if (i != j && !flags[j]) {
						if (sh.list.get(i)[0].equals(sh.list.get(j)[0])) {
							temp[1] = (Integer.parseInt(temp[1]) + Integer.parseInt(sh.list.get(j)[1]))+"";
							flags[j] = true;
						}
					}
				}
				aux.add(temp);
			}
		}
		sh.list = aux;
		for (String[] i : sh.list) {
			System.out.println(i[0] + " " + i[1]);
		}
	}
}
L

Obrigado pelos esclarecimentos… bem…segui a sua idéia e resolvi o problema…
Quanto a objeto Map… a princípio não seria um inteiro a ser usado na segunda posição do array de string e sim mais uma string…
Somente depois que foi mudado para inteiro…por isso não posso mecher esse tipo de objeto…senão vou ter que vasculhar um sistema inteiro…

Mas qual a razão…do Map?, claro…além da eliminação do cast para inteiro…?

Vinicius_Zibetti_Res

Eh que o MAP acessa por indice não repetido, se ja tiver um Indice por ex: A100, ele não cria outro com outro valor, apenas substitui o mesmo, ai vc faz as modificações antes de substituir…

W

Como faria o mesmo com map???

Criado 21 de outubro de 2011
Ultima resposta 18 de ago. de 2014
Respostas 5
Participantes 4