Vetor e JSP

3 respostas
W

Bom como o problema dessa vez é mais complicado (pelo menos para mim) serei bem completo na pergunta.

É o seguinte. Preciso fazer um programa que leia N número e mostre os repetidos E quantas vezes foram repetidos.

O que eu ja fiz: ja li os números, ja organizei, e ja consigui mostrar os repetidos e quantas vezes foram repetidos.

Então qual é o problema??.

O problema é que quando se usa este vetor “vet[i+1]” como comparação é preciso que o for esteja com seu tamanho menos 1 (vet.length-1). Porque??. Porque por exemplo, em um vetor com 7 posições quando ele chegar em “vet[6]” ele ira comparar com o “vet[i+1]”, nesse caso, “vet[7]” que nao existe. Daiiii o que acontece, se eu escrever por exemplo “1,3,1,3,2,1,4,3” o meu programa roda perfeitamente. O troço esta quando o maior número (eu ordeno) esta repetido…ex: “1,3,1,3,2,1,3”

Então ai vai o que eu ja tenho (comentado):

<%   
        String nome = request.getParameter("nome"); //recebendo valor digitado na caixa no index.jsp   
        String vet[] = nome.split(","); //nao lembro :P   
        int cont = 1; //variavel usada para a repetição de numeros   
        int vet1[] = new int[vet.length]; // criando vetor inteiro   
           
        for(int i =0 ;i<vet.length;i++){   
            vet1[i] =  Integer.parseInt(vet[i]);            // transformando cada posição em inteiro, ja que recebe do index.jsp como string   
        }           
                     
        for (int i =0;i<vet1.length;i++){   
            out.println (vet1[i]+" ");            //mostrando vetor inteiro,  para verificar se o código até aqui esta dando certo   
        }   
        %><br><%         
        for (int j = 0; j <vet1.length;j++){   
            for (int i = 0; i < vet1.length-1;i++){   
                if (vet1[i] > vet1[i+1]){   
                    int aux = vet1[i];                 //nestes 2 for estou arrumando o vetor com bubblesort em ordem crescente (menor para o maior)   
                    vet1[i] = vet1[i+1];   
                    vet1[i+1] = aux;   
                }   
            }   
        }   
           
        for (int i = 0;i<vet1.length;i++){   
            out.println (vet1[i]+" ");                                //neste for estou mostrando o vetor ordenado para fins de verificação tambem..   
        }       
        %><br><%           
        for (int i = 0; i < vet1.length-1; i++){   
            if (vet1[i] == vet1[i+1]){                             //comentario sobre este for fora do código   
                cont = cont + 1;   
            }else {   
                if (cont != 1){   
                    out.println ("O número "+vet1[i]+" foi repetido "+cont+" vezes.<br>");   
                    cont = 1;   
                }   
            }               
        }                 
        %>

O que esta acontecendo ali: estou pegando cada posição do vetor e comparando com a próxima, se for igual o contador (cont) recebe +1, senão ele mostra quantos ja foram e volta para a proxima posição, se o vetor for diferente e houver apenas 1 vez o numero (cont = 1) ele nao aparece que foi repetido nenhuma vez.
O problema como podem notar neste caso “1,3,1,3,2,1,3” ordenado “1,1,1,2,3,3,3”, é que ao chegar no ultimo numero “3” ele nao entra no else para mostrar qnts vezes o “3” foi inserido, porque ele n pode compara o ultimo com o próximo, pois nao existe.

O que faço???

3 Respostas

G

Willbre,

A coisa ta sendo feito meio na unha no seu código, da a entender que seja um exercício p/ aprender a teoria do BubbleSort.

No entanto, se você está apenas atrás de uma solução, fiz uma implementação mais apresentável, segue como sugestão p/ melhorias e adaptações no seu JSP…

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Teste{

    public static void main(String[] args) {
        
        String input = "1,3,1,3,2,1,4,3";
        String[] inputArray = input.split(",");
        
        // Ordenando o Array
        Arrays.sort(inputArray);
        
        List&lt;Integer&gt; lstInteger = new ArrayList&lt;Integer&gt;();
        Map&lt;Integer, Integer&gt; mapRepeticoes = new HashMap&lt;Integer, Integer&gt;();
        
        // Verificando as repeticoes
        for (int i = 0; i &lt; inputArray.length; i++) {
            Integer inputInt = new Integer(inputArray[i]);
            if(lstInteger.contains(inputInt)) {
                int nRepeticoes = (mapRepeticoes.get(inputInt) != null ? mapRepeticoes.get(inputInt) : 0); 
                mapRepeticoes.put(inputInt,  nRepeticoes + 1);
            } else {
                lstInteger.add(inputInt);
            }
        }
        
        System.out.println("Numeros Ordenados =&gt; " + lstInteger);
        System.out.println("Resumo das Repetições =&gt;" + mapRepeticoes);
        
        // Detalhamento das Repetições printando "Bunitinho"
        for (Integer key : mapRepeticoes.keySet()) {
            System.out.println("O Número " + key + " repetiu " + mapRepeticoes.get(key) + " vezes.");
        }
    }
}

:wink:

W

Puts cara, vle mesmo pela força, mas nao intendi absolutamente nada do q vc fez… :confused:

Esqueci de citar, estou na faculdade, intaum é desse jeito que tem q ser feito, n precisa ser entregue nem nada, mas não quero dexa pra la só pq nao consigui…brigadao viu :slight_smile:

G

Willbre,

No código que você fez … foram utilizado apenas tipos primitivos, enquanto que no código que passei, foi usado além dos tipos primitivos alguns tipos que a gente chama no java de tipos de Referência, Classes Wrapper… (Pesquise sobre isto :wink: )

Sugiro que leia o código que passei e oq tiver duvida sobre oq faz ou como funciona… pesquise aqui no fórum ou mesmo no Google.

Leia sobre:

:arrow: Arrays.sort(), Collections.sort()

:arrow: List, ArrayList, Map, HashMap

:arrow: Estrutura de repetição foreach

Já vai dar uma ótima noção p/ que você entenda oq foi feito no código, e baseado em suas conclusões, melhor o seu.

Att

Criado 20 de setembro de 2011
Ultima resposta 20 de set. de 2011
Respostas 3
Participantes 2