String com sequência de números

18 respostas
A

Amigos, preciso de um algoritmo (em java) que leia um array de inteiros e retorne uma string com os números contidos no array, considerando o seguinte:
No caso de intervalos contínuos, devem constar da string apenas o primeiro e o último número separados pela expressão " a ".
No caso de números que não representam intervalos contínuos, devem estar separados por ", " (virgula e espaço).

Tentando explicar melhor com um exemplo:

Imaginemos um array de inteiros com os sequintes números (os números não se repetem no array):
1, 2, 3, 4, 5, 6, 7, 8, 11, 15, 22, 23, 24, 25, 26, 27, 28, 35, 39

O resultado deve ser uma string com o seguinte conteúdo:
“1 a 8, 11, 15, 22 a 28, 35, 39”

Alguém consegue ajudar?

Saudações.

18 Respostas

Rodrigo_Sasaki

Opa, claro que conseguimos :slight_smile:

O que você já fez?

vitordarela

Poste seu código para termos uma base doque você já fez ;D

paulohms

andredf ,

Existem algumas maneiras de fazer isso, como você começou ?

Coloca o código ai pra que possamos ajudar.

Vlw

Rodrigo_Sasaki

paulohms:
Rodrigo,

Existem algumas maneiras de fazer isso, como você começou ?

Coloca o código ai pra que possamos ajudar.

Vlw


Rodrigo? :slight_smile:

bastides

Manda o código…

[]'s

A
private String sequencia(List<Integer> numeros) {
        
        String retorno = "";
        
        if (!numeros.isEmpty()) {
        
            int qtdNumeros = numeros.size();

            if (qtdNumeros == 1) {
                
                retorno = String.valueOf(numeros.get(0));

            } else {

                StringBuilder b = new StringBuilder(numeros.size() * 6);

                for (int z = 0; z < numeros.size() - 1; z++) 
                    b.append(String.valueOf(numeros.get(z))).append(", ");

                b.append(String.valueOf(numeros.get(numeros.size()-1)));

                retorno = b.toString();
            }

        }
        return retorno;
    }

Acima o código que consegui até agora.

Estou usando StringBuilder por que, como o array pode conter muito números, se fosse usar concatenação de string, o desempenho ficaria comprometido.

O que falta no método é justamente tratar as sequencias contínuas (exemplo, "25 a 47").

vitordarela

para tratar a sequencia utilize o método SPLIT(’,’) e SPLIT(‘a’) para quebras de linhas e tratamento do código!

acho que isso resolve seu problema!

L

Olá amigo.

Eu pensaria em algo da seguinte forma.

Iria analisando a difrença entre o numero na posição [i] menos do da posição [i-1];
Se a diferença for 1 , e por ai vai, vc printa akele parada do 1 A x ai quando vc encontrar uma diferença maior do que 1, print o numero na posição [i-1] para fechar o intervalo, e depois o [i] que e o numero que não coube no intervalo.
Caso a diferença seja maior do que 1, e só printar normalmente o numero.

Não sei se ficou confuso, mais posta seu código ai para adaptarmos algo, ou incrementar alguma coisa, abraço

novato25

Bom, eu estava meio sem ter o que fazer… então, testa isso:

public class Main {

	 public static void main(String[] args) {
		int[] vetor = {1, 2, 3, 4, 5, 6, 7, 8, 11, 15, 22, 23, 24, 25, 26, 27, 28, 35, 39 };
		
		int cont = 0;
		StringBuilder str = new StringBuilder();
		
		String c = String.valueOf(vetor[0]);
		
		for(int i=0; i<vetor.length; i++) {
			if(i < vetor.length -1) {
				if(vetor[i] + 1 == vetor[i + 1]) {
					cont++;
					continue;
				}
			}
			
			if(cont > 0) {
				str.append(c).append(" a ").append(vetor[i]);
				cont=0;
			} else {
				str.append(vetor[i]);
			}
			
			if(i < vetor.length-1) {
				str.append(",");
				c = String.valueOf(vetor[i + 1]);
			}
		}
		
		System.out.println(str);
	}
}
novato25

eu testei o seu exemplo com o meu código e o resultado foi: 1 a 2,5 a 8,10 a 11,20,30,40

novato25

ahhh, tá… entendi… então o intervalo seria mais de 1 para colocar a separação com a letra ‘a’.

novato25
Então tenta isso:
public class Main2 {

	 public static void main(String[] args) {
		int[] vetor = {1, 2, 3, 4, 5, 6, 7, 8, 11, 15, 22, 23, 24, 25, 26, 27, 28, 35, 39 };
		//int[] vetor = {1, 2, 5, 6, 7, 8, 10, 11, 20, 30, 40 };
		
		int cont = 0;
		StringBuilder str = new StringBuilder();
		
		String c = String.valueOf(vetor[0]);
		
		for(int i=0; i<vetor.length; i++) {
			if(i < vetor.length -1) {
				if(vetor[i] + 1 == vetor[i + 1]) {
					cont++;
					continue;
				}
			}
			
			if(cont == 1) {
				str.append(c).append(",").append(vetor[i]);
				cont=0;
			} else if(cont > 1) {
				str.append(c).append(" a ").append(vetor[i]);
				cont=0;
			} else {
				str.append(vetor[i]);
			}
			
			if(i < vetor.length-1) {
				str.append(",");
				c = String.valueOf(vetor[i + 1]);
			}
		}
		
		System.out.println(str);
	}
}
bastides
String retorno = "";  
	      
	    List<Integer> numeros = new ArrayList<Integer>();
	    
	    numeros.add(1); 
	    numeros.add(2); 
		numeros.add(3);
		numeros.add(4);
		numeros.add(5);
		numeros.add(6);
		numeros.add(7);
		numeros.add(8);
		numeros.add(11);
		numeros.add(15);
		numeros.add(22); 
		numeros.add(23);
		numeros.add(24);
		numeros.add(25);
		numeros.add(26);
		numeros.add(27);
		numeros.add(28);
		numeros.add(35);
		numeros.add(39); 
	    
		if (!numeros.isEmpty()) {  
	      
	        int qtdNumeros = numeros.size();  
	  
	        if (qtdNumeros == 1) {  
	              
	            retorno = String.valueOf(numeros.get(0));  
	  
	        } else {  
	  
	            StringBuilder b = new StringBuilder(numeros.size() * 6);  
	            int ultimo = numeros.get(0);
	            b.append(String.valueOf(numeros.get(0)));
	            for (int z = 1; z < numeros.size(); z++){
	            	
            		if(numeros.get(z)-1 == ultimo){
            			
        				if(!"a".equals(b.toString().substring(b.length()-1, b.length())))
        					b.append(" a");
            		            			
            		} else {
            		
            			if("a".equals(b.toString().substring(b.length()-1, b.length())))
            				b.append(" "+ultimo);
            			else
            				b.append(", " +ultimo);
            		}
            		ultimo = numeros.get(z);
	            	
	            	System.out.println(b.toString() + ", z = " + z);
	            }
	  
	  
	            retorno = b.toString();  
	        }  
	  
	    }

Eh quase isso..mas acho que o exemplo do amigo acima ta mais bem pensado.

escolhe um dos dois e termina pra chegar exatamente onde voce quer...espero ter ajudado.

[]'s

R

Demorei uns 20 minutos, mas acho que ta legal.

Retirei o codigo, ele ta perigoso =D

Código nao 100% funcional - PERIGO
R

Ahhh, se quiser usar StringBuilder, c ki sabe, fiz so pra voce entender a logica mesmo.

R

Ahhh, ta legal nao, testei uma sequencia diferente aqui, deu galho ¬¬, heheheh, so funciona pra certos tipos de sequencia, bom, mas ja da pra começar, flw e boa sorte =D

A
novato25:
Então tenta isso:
public class Main2 {

	 public static void main(String[] args) {
		int[] vetor = {1, 2, 3, 4, 5, 6, 7, 8, 11, 15, 22, 23, 24, 25, 26, 27, 28, 35, 39 };
		//int[] vetor = {1, 2, 5, 6, 7, 8, 10, 11, 20, 30, 40 };
		
		int cont = 0;
		StringBuilder str = new StringBuilder();
		
		String c = String.valueOf(vetor[0]);
		
		for(int i=0; i<vetor.length; i++) {
			if(i < vetor.length -1) {
				if(vetor[i] + 1 == vetor[i + 1]) {
					cont++;
					continue;
				}
			}
			
			if(cont == 1) {
				str.append(c).append(",").append(vetor[i]);
				cont=0;
			} else if(cont > 1) {
				str.append(c).append(" a ").append(vetor[i]);
				cont=0;
			} else {
				str.append(vetor[i]);
			}
			
			if(i < vetor.length-1) {
				str.append(",");
				c = String.valueOf(vetor[i + 1]);
			}
		}
		
		System.out.println(str);
	}
}

Muito bom o seu código.
Fiz algumas pequenas alterações e em princípio está funcionando como o esperado.

public String sequencia(List<Integer> numeros) {   
           
        int cont = 0;   
        StringBuilder str = new StringBuilder();   
           
        String c = String.valueOf(numeros.get(0));   
           
        for(int i=0; i<numeros.size(); i++) {   
            if(i < numeros.size() -1) {   
                if(numeros.get(i) + 1 == numeros.get(i + 1)) {   
                    cont++;   
                    continue;   
                }   
            }   
               
            if(cont == 1) {   
                str.append(c).append(", ").append(numeros.get(i));   
                cont=0;   
            } else if(cont > 1) {   
                str.append(c).append(" a ").append(numeros.get(i));   
                cont=0;   
            } else {   
                str.append(numeros.get(i));   
            }   
               
            if(i < numeros.size()-1) {   
                str.append(", ");   
                c = String.valueOf(numeros.get(i + 1));   
            }   
        }   
           
        return str.toString();   
    }

Vou aprofundar os testes.
Valeu!!!!

WellingtonRamos

@Novato25, não cheguei a testar teu código, mas creio que ele possui um comportamento um pouco estranho se modificar a entrada de dados.

Exemplo: 1, 2, 5, 6, 7, 8, 10, 11, 20, 30, 40
O resultado que eu esperaria é 1, 2, 5 a 8, 10, 11, 20, 30, 40

Mas por teu código seria 1 a 2, 5 a 8, 10 a 11, 20, 30, 40

Ou seja, seu controle deveria verificar apenas se maior que 1 (o que implica outras modificações). Mas o caminho é mais ou menos esse.

E mais um exercício solucionado…

Criado 15 de fevereiro de 2013
Ultima resposta 15 de fev. de 2013
Respostas 18
Participantes 9