Array que imprima nºs nao repetidos

Vim pedir ajuda ake a galera q saca alguma coisa d java…
tenho um exercício que nao consigo resolver…

Ex: classe com Array para resolver o seguinte problema:

ler 20 numeros entre 10 e 100. a medida q forem lidos… imprimir somente
se ele nao tiver sido lido antes. Utilizar o menor array possivel.

ajudem ae por favor!

abraço;

A melhor forma seria usando um LinkedSe/HashSett.

Voce pode implementar da seguinte forma:

  1. tirar os dados do array e parra para o LinkedSet e depois imprimir.
  2. Ou gravar ja os dados no LinkedSet.

Bom nao sei qual os pre-requisitos do seu exercicios, se for da faculdade/curso tecnico veja com seu professor… quando estudava na faculdade java o professor nao permitia que fosse usado… quando ele pedia… algo com array… isso por que o assunto na aula era ele por exemplo, mais poderia usar outras formas de implementacao no trabalho… por exemplo…

import java.util.Set;
import java.util.HashSet;
class SetTest{
	public static void main(String [] agrs){
		Set s = new HashSet();
		s.add(42);		
		s.add(42);
		s.add(77);
	System.out.println(s);
}}

flw!!
flw!

use o Set !!!

Olá brunocl14,

acredito que a idéia do seu professor seja ver você trabalhando com arrays. Então aqui vão duas idéias que podem te ajudar:

1-Use um array booleano para identificar se o número já foi lido ou não. Semrpe que um número é lido você checa o array. Se estiver marcado como já lido, você não imprime. Caso contrário você marca como lido e imprime. Você vai precisar de um array com 91 posições (de 10 até 100)

2-Em um array armazene os número que você já leu. A cada número você varre o array inteiro e checa se ele já está lá. Se não estiver você imprime e acrescenta ele no array. Caso contrário não faz nada. Você vai precisa de no máximo 20 posições para isso (no caso da entrada possuir apenas números diferentes).

Espero ter ajudado.

Concordo com o Jonas.

E procure fazer o exercício você mesmo. Só tem um jeito de aprender a programar bem… é programando.

Pedir pro pessoal do fórum resolver para você, além de uma grande falta de ética, não vai te ajudar a se tornar um bom profissional.

pow… ja tentei implementar d vários jeitos… tentei td ants d recorrer ao fórum!

o professor exige q seja usado array! faço curso técnico de info;

[code]import javax.swing.JOptionPane;
public class Ex5 {
public static void main(String args[]){
boolean duplicata=false;
int x=0;
int n [] = new int [20];

    for (int i=0;i<=19;i++){
        n[i] = Integer.parseInt(JOptionPane.showInputDialog("n°entre 10 e 100:"));
        if (i>=1){
          for (x = i;x>0;x--){
            if (n[i]!=n[x]){ // se n na posição x for igual n atual
                duplicata=false;   // duplicata = false
            } else  {          // caso contrário
                duplicata=true;   // duplicata = true
            }
          }
        }
        if (duplicata==false){ // se duplicata = false
            JOptionPane.showMessageDialog(null,"N°: "+n[i]);  // mostre
        }
    }
}

}[/code]

tentei assim mas depois da primeira leitura a verificação da duplicata falha…

dsculpem ae qq besteira mas por enquanto é isso ae… ajuda ae kem puder plz!

abraço;

Ok… já que vc já tentou… vai aí a solução. Estude-a:

[code]
import java.util.Arrays;
import javax.swing.JOptionPane;

public class Ex5
{
public static void main(String[] args) {
//Criamos um array que diz o que já foi impresso
boolean jaFoiImpresso[] = new boolean[91];

    //Preenchemos ele com false, pois nada foi impresso
    Arrays.fill(jaFoiImpresso, false);
            
    for (int i = 0; i < 20; i++) {
        //Lemos um número
        int valor = Integer.parseInt(JOptionPane.showInputDialog("n°entre 10 e 100:"));

        //Se ele ainda não foi impresso
        if (!jaFoiImpresso[valor - 10])
            System.out.println("Valor: " + valor); //Imprimos

        //Marcamos a posição como impressa.
        jaFoiImpresso[valor - 10] = true; 
    }
}

}[/code]

As continhas são pq como o seu número é de 10 a 100, e os arrays do java iniciam em 0, é necessário descontar o número inicial (10) para mapear de um índice até outro.
Assim, se o usuário informou 10, marcamos na posição 0 do array, se informou 11, marcamos na posição 1 e assim por diante…
Sempre que pedir ajuda num exercício aqui no fórum, ponha o que você já fez aqui. Você vai ver que muita gente se sente muito mais disposto a ajudar. :wink:

PS: Há uma forma ninja super econômica de se fazer esse exercício, usando apenas 2 posições de um array long e operadores de operações de bit.

ViniGodoy … axo q vc nao entendeu direito…

eu n tenho q ler os numeros de 10 a 100… o usuário entra com qq valor entre 10 e 100 por 20 vezes…
e eu soh imprimo os q ele ainda n digitou anteriormente…
foi mal ae se eu nao expliquei direito… 1ª vez ae em fórum…

e qual seria essa forma ninja?? O.Ô [ curioso ] kk

Ué… e não é isso que o programa faz?

Ok, eis a forma ninja. Usa um array de apenas 2 posições:

[code]
import java.util.Arrays;
import javax.swing.JOptionPane;

public class Ex5 {
public static void main(String[] args) {
long jaFoiImpresso[] = new long[2];
Arrays.fill(jaFoiImpresso, 0);

    for (int i = 0; i < 20; i++) {
        int valor = Integer.parseInt(JOptionPane.showInputDialog("n°entre 10 e 100:"));
        long offSet = valor - (valor < 74 ? 10 : 74);                            
                    
        if ((jaFoiImpresso[valor < 74 ? 0 : 1] & (1L << offSet)) == 0)
            System.out.println("Valor: " + valor);
        jaFoiImpresso[valor < 74 ? 0 : 1] |= 1L << (offSet);
    }
}

}[/code]

Acho que essa é a versão mais econômica possível com o conhecimento que você tem até agora. Note que a primeira que postei foi a primeira sugestão do jonas, e essa é a segunda. Nessa versão, cadastramos os números já encontrados numa lista.

Mas não vou varrer o array inteiro, como ele comentou. Vou varre-lo até encontrar o número, ou uma posição que ainda não tenha um número cadastrado.
Isso poupa algumas comparações, especialmente quando o array está quase vazio.

[code]
import java.util.Arrays;
import javax.swing.JOptionPane;

public class Ex5 {
public static void main(String[] args) {
int jaFoiImpresso[] = new int[19];
Arrays.fill(jaFoiImpresso, 0);

    for (int i = 0; i < 20; i++) {
        int valor = Integer.parseInt(JOptionPane.showInputDialog("n°entre 10 e 100:"));
        
        //Verifica se o numero está na lista
        for (int j = 0; j < 20; j++) {
            //Já está na lista? Então não precisamos continuar o loop.
            if (jaFoiImpresso[j] == valor)
                break;
            
            //Não está? Imprime, adiciona na lista e sai do loop
            if (jaFoiImpresso[j] == 0)                
            {
                System.out.println("Valor: " + valor);
                if (j != 19)
                   jaFoiImpresso[j] = valor;
                break;
            }
            
            //Se chegou aqui é pq outro número está na lista, 
            //então precisamos continuar procurando
        }
    }
}

}[/code]

Ontem no banho eu tive um estalo.

Não são necessárias 20 posições no array, só 19.
Isso porque não precisamos inserir a última caso não seja encontrada, já que o código vai acabar de um jeito ou de outro e, portanto, o último número fornecido nunca vai ser comparado com ninguém.

O código ali em cima está corrigido.

[quote=ViniGodoy]Ué… e não é isso que o programa faz?

Ok, eis a forma ninja. Usa um array de apenas 2 posições:

[code]
import java.util.Arrays;
import javax.swing.JOptionPane;

public class Ex5 {
public static void main(String[] args) {
long jaFoiImpresso[] = new long[2];
Arrays.fill(jaFoiImpresso, 0);

    for (int i = 0; i < 20; i++) {
        int valor = Integer.parseInt(JOptionPane.showInputDialog("n°entre 10 e 100:"));
        long offSet = valor - (valor < 74 ? 10 : 74);                            
                    
        if ((jaFoiImpresso[valor < 74 ? 0 : 1] & (1L << offSet)) == 0)
            System.out.println("Valor: " + valor);
        jaFoiImpresso[valor < 74 ? 0 : 1] |= 1L << (offSet);
    }
}

}[/code]
[/quote]

Vou ter que entrar para escola de artes marciais para entender facilmente isso.

Comece a estudar C++ e C e você vai ver até bastante coisa usando bitwise operators.

Mas realmente, faz parte das técnicas de programação dos cinco cortes do mestre Cisne Branco. :lol: