Agrupar sequencias de um list de inteiro [RESOLVIDO]

22 respostas
L

Boa tarde…
Como faço para agrupar sequencias de inteiros vindos de um List ?

Ex:
tenho um list com o conteúdo:

50 ,56,57,58,59, 61,62 65 68,69, 71

o que tenho que gerar seria um novo List com objetos que contenham inicio e fim de sequencias…
considerando o objeto sequencia

public class sequencia{
     private int inicio;
     private int fim;

... getters e setters
}

no final, meu método tem que retornar uma listagem com objetos sequencia com os valores:
LISTAGEM:
POS1 Sequencia(inicio = 50, fim = 50)
POS2 Sequencia(inicio = 56, fim = 59)
POS3 Sequencia(inicio = 61, fim = 62)
POS4 Sequencia(inicio = 65, fim = 65)
POS5 Sequencia(inicio = 68, fim = 69)
POS6 Sequencia(inicio = 71, fim = 71)

Não sei se fui claro…

Não estou conseguindo achar uma lógica para implementar isso…

22 Respostas

yhhik

vc quer gerar uma lista com o objeto sequencia de uma lista de inteiro?

se vc só precisa do primeiro é do ultimo, jogue essa lista de inteiro em uma estrutura de repetição e tire o menor e o maior numero e insira no objeto sequencia(FIM e INICIO).

J

Cara de fato você não foi muito claro. A explicação do objetivo ficou confusa.

A saída:

LISTAGEM:
POS1 Sequencia(inicio = 50, fim = 50)
POS2 Sequencia(inicio = 56, fim = 59)
POS3 Sequencia(inicio = 61, fim = 62)
POS4 Sequencia(inicio = 65, fim = 65)
POS5 Sequencia(inicio = 68, fim = 69)
POS6 Sequencia(inicio = 71, fim = 71)

tem alguma ligação com a entrada

50 ,56,57,58,59, 61,62 65 68,69, 71

ou foi só um exemplo que você deu? Se há ligação, como vc chegou a essa saída?

L

Desculpe acho que não fui claro…

O que não consigo é achar uma lógica para achar as sequencias numéricas dentro de uma listagem passada…

tipo… achar o início e o fim das sequencias dentro da listagem…

Seguindo a listagem… 50 ,56,57,58,59, 61,62 65 68,69, 71

sequencia1 50 até 50
sequencia2 56 até 59
sequencia3 61 até 62
e assim por diante…

quando o numero está sozinho, o inicio e o fim serão os mesmos

D

Faz um ArrayList de um ArrayList do tipo int
Você já pensou em como fazer a parte de lógica de como verificar as sequencias?

L

danilovicente:
Faz um ArrayList de um ArrayList do tipo int
Você já pensou em como fazer a parte de lógica de como verificar as sequencias?

Sim…estou tentando fazer com um List… mas o problema é a parte lógica…
Não sei porque , mas algo me diz que com recursão eu conseguirei… fazer…mas não descobri…ainda…

D

Posta aí o que conseguiu até o momento.

pmlm

Recursão? Um simples for ou while resolve o problema!

J

Sua lista de números sempre vai estar ordenada ou os números podem ter ordem aleatória?

L

vai estar ordenada…pois ordenarei elas antes de passar para o método de agrupamento que estou tentando fazer

L

O que tenho no momento

é um método onde recebe a listagem com inteiros…estes inteiros são numeros de notas fiscais não utilizadas…
Neste método tenho que agrupar estas sequencias e retornar o list…com objetos SequenciaNUtilizada

public List<SequenciaNUtilizada> localizaSequenciasNUtilizadas(List<Integer> lst){
      List<SequenciaNUtilizada> lstRetorno = new ArrayList<SequenciaNUtilizada>();
      int inicio = 0;
      int fim = 0;
        for (Integer nrNota: lst){
... aqui que complica.... tenho que achar o inicio e o fim de cada sequencia contida na listagem recebida como parâmetro e...
   gerar um new SequenciaNUtilizada , setar o inicio e o fim... e adicionar no lstRetorno
        }



return lstRetorno;


}

Aqui a classe de sequenciaNutilizada

public class SequenciaNUtilizada(){
     private int inicio;
     private int fim;
......getters e setters


}
douglaskd

L

Douglas…não é string…é um List de inteiros…

douglaskd

malz,

só percebi quando vi seu ultimo código…rs

luci.al

Olá!

o que está confuso é essa sua sequência. vc tem uma lista de inteiros e dela vc vai tirar varias sequencias correto?
mas como vc vai identificar onde termina e onde comessar cada sequencia?

douglaskd

cara fiz esse código estranho aqui, nem testei...mais acho que funciona... :twisted:

for(i=0;i<=lst.count(); i++){

inicio = lst.get(i);
fim = inicio;
i++;

while(fim++ == lst.get(i)){
i++;
}

//preenche sequencia inicio e fim;

retorno.add(sequencia);

}

explicando: o for nao vai repetir i vezes, vai repetir 6, pois i la em baixo esta sendo incrementado também...

L

luci.al:
Olá!

o que está confuso é essa sua sequência. vc tem uma lista de inteiros e dela vc vai tirar varias sequencias correto?
mas como vc vai identificar onde termina e onde comessar cada sequencia?

Sim… tenho uma lista e desta lista, tenho que tirar as sequencias…
Agora vc chegou no ponto da questão…!!! Como vou identificar as sequencias…!!!

luci.al

leopoldof:
Boa tarde…
Como faço para agrupar sequencias de inteiros vindos de um List ?

Ex:
tenho um list com o conteúdo:

50 ,56,57,58,59, 61,62 65 68,69, 71

o que tenho que gerar seria um novo List com objetos que contenham inicio e fim de sequencias…
considerando o objeto sequencia

public class sequencia{
     private int inicio;
     private int fim;

... getters e setters
}

no final, meu método tem que retornar uma listagem com objetos sequencia com os valores:
LISTAGEM:
POS1 Sequencia(inicio = 50, fim = 50)
POS2 Sequencia(inicio = 56, fim = 59)
POS3 Sequencia(inicio = 61, fim = 62)
POS4 Sequencia(inicio = 65, fim = 65)
POS5 Sequencia(inicio = 68, fim = 69)
POS6 Sequencia(inicio = 71, fim = 71)

Não sei se fui claro…

Não estou conseguindo achar uma lógica para implementar isso…

sim…mas como vc chegou a essa saida?
o que elas tem em comum?
como vc saobe que a primeira seuqencia so tem o numero 50 e a segunda sequencia tem 4 numeros?

L

luci.al…
No meu pensar…sequencia de números…seria um número seguido de outro…

tipo… 1-2-3…seria uma sequencia…
6-7 seria outra sequencia

e quando um número esta sozinho seria uma sequencia de um número…ao menos é assim que o método teria que retornar…

L
douglaskd:
cara fiz esse código estranho aqui, nem testei...mais acho que funciona... :twisted:
for(i=0;i<=lst.count(); i++){

inicio = lst.get(i);
fim = inicio;
i++;

while(fim++ == lst.get(i)){
i++;
}

//preenche sequencia inicio e fim;

retorno.add(sequencia);

}

explicando: o for nao vai repetir i vezes, vai repetir 6, pois i la em baixo esta sendo incrementado também...

esta seria a idéia que minha cabeça travada não estava querendo ter he he he he......vou implementar aqui....e ver se funciona... depois posto os resultados.....

D

É assim a lógica ele pega um numero e vê se o próximo número e 1 maior que ele e assim por diante formando a sequencia, quando não for 1 maior ele fecha a sequencia e começa a próxima

ViniGodoy
Tá na mão:
import java.util.ArrayList;
import java.util.List;

public class Main {
	private static class Sequencia {
		int inicio;
		int fim;

		public Sequencia(int inicio) {
			this.inicio = inicio;
			fim = inicio;
		}

		@Override
		public String toString() {
			if (inicio != fim)
				return "Inicio: " + inicio + " Fim: " + fim;
			return "Apenas: " + inicio;
		};
	}

	private static List<Sequencia> gerarSequencias(int[] numeros) {		
		List<Sequencia> sequencias = new ArrayList<Sequencia>();
		Sequencia seq = new Sequencia(numeros[0]);
		for (int i = 1; i < numeros.length; i++) {
			if (seq.fim + 1 == numeros[i])
				seq.fim++;
			else {
				sequencias.add(seq);
				seq = new Sequencia(numeros[i]);
			}
		}
		return sequencias;
	}

	public static void main(String[] args) {
		int[] numeros = { 50, 56, 57, 58, 59, 61, 62, 65, 68, 69, 71 };

		for (Sequencia sequencia : gerarSequencias(numeros))
			System.out.println(sequencia);
	}
}
L

Obrigado a todos que responderam…

bom… implementei aqui utilizando as idéias do vinigodoy e do douglas… e funcionou aqui…

Obrigado… por sanar esta lógica que eu estava quebrando a cabeça (depois de um dia inteiro brigando com as NF-e … cabeça cançada por sinal he he he)…
Este método me serviu para unir as faixas de numeração de nfe que não foram utilizadas pelo usuário e mostrar numa tabela
a faixa inicial e final para que o usuário possa inutiliza-las na sefaz…

Criado 6 de janeiro de 2012
Ultima resposta 6 de jan. de 2012
Respostas 22
Participantes 8