String com sequência de números

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.

Opa, claro que conseguimos :slight_smile:

O que você já fez?

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

andredf ,

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

Coloca o código ai pra que possamos ajudar.

Vlw

[quote=paulohms]Rodrigo,

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

Coloca o código ai pra que possamos ajudar.

Vlw[/quote]
Rodrigo? :slight_smile:

Manda o código…

[]'s

[code] private String sequencia(List 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;
}

[/code]

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”).

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!

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

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);
	}
}

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

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

Então tenta isso:

[code]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);
}

}[/code]

[code]

	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();  
        }  
  
    }  
[/code]

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

Demorei uns 20 minutos, mas acho que ta legal.

Retirei o codigo, ele ta perigoso =D

Código nao 100% funcional - PERIGO

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

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

[quote=novato25]Então tenta isso:

[code]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);
}

}[/code]
[/quote]

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

[code] public String sequencia(List 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();   
}   

[/code]

Vou aprofundar os testes.
Valeu!!!

@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…