Problemas com arrays!

35 respostas
S

Boas pessoal, tenho um trabalho pra fazer mas tou com alguns problemas em relação aos arrays, preciso de fazer operações com arrays como se fossem conjuntos:

. como tirar os elementos repetidos int num array?
. como posso fazer operações de diferença, união e intersecção entre dois arrays?

espero q me possam ajudar, preciso mesmo de ajuda…

35 Respostas

S

desculpa, sim é em Java, e infelizmente nao posso usar collections, seria muito melhor…

bcartaxo

Kra pelo q tu tais me falando tu queres implemntar uma espécie de conjunto (conceito matemático mesmo). Existe uma interface em java da API de collections q chamsse Set (conjunto em ingês), pois bem, como vc ja disse n pode usar collections, então tenta dar uma sacada nas classes q implementam essas interface e olha a implementação dos métodos q te interessam. è mais uma dica mesmo. Flw.

Adolfo_Rodrigues

Cara, tem um artigo muito bom na Mundo Java deste mês que trata exatamente disso que você tá precisando. Seu professor deve ter lido e gostado do artigo :slight_smile:

S

entao pessoal ninguem tem ideias?

LPJava

cara usar array para elementos repetidos eh complicado mao de obra danada e vc vai ficar com dor de cabeça… dar uma estuda em Collection e as classes que implementar a interface Set… olha no meu resumo que fiz para certificacao… vai lhe ajudar capitulo 7 tem exemplo que nao aceita elementos repetidos… nao passa de 10 linhas a sintaxe…

S

Obrigadao, de certeza q me vai ajudar…

S

Pessoal isto ainda ta complicado, não percebo nada de classes e construtores…

kaabah

No caso de achar elementos repetidos, acho que fica mais eficiente você ordenar seu array e depois percorre-lo uma unica vez verificando se tem elemento repetido.

Seu algoritmo vai ser a (ordem do seu método de ordenação) + O(n).

Após ordenado, pegue seu primeiro elemento e saia varrendo. Enquanto for igual exclua. No momento que achar um maior, pegue-o e vá comparando do mesmo jeito que você fez com o primeiro e assim por diante.

Acho q pode ser por aí… :idea:

Marky.Vasconcelos

kaabah:
No caso de achar elementos repetidos, acho que fica mais eficiente você ordenar seu array e depois percorre-lo uma unica vez verificando se tem elemento repetido.

Seu algoritmo vai ser a (ordem do seu método de ordenação) + O(n).

Após ordenado, pegue seu primeiro elemento e saia varrendo. Enquanto for igual exclua. No momento que achar um maior, pegue-o e vá comparando do mesmo jeito que você fez com o primeiro e assim por diante.

Acho q pode ser por aí… :idea:

mas no seu exemplo seria para arrays com sequencia como 1,1,2,2,2,3,3,3;
e se fossem numeros aleatorios como
1,2,5,7,9,4,1,3,6,2,5?

kaabah

mas no seu exemplo seria para arrays com sequencia como 1,1,2,2,2,3,3,3;
e se fossem numeros aleatorios como
1,2,5,7,9,4,1,3,6,2,5?

Pois é… experimenta ordenar essa sequencia que você me passou!!

1,2,5,7,9,4,1,3,6,2,5

oredenando…

1,2,2,3,4,5,6,7,9

:wink:

Marky.Vasconcelos

kaabah:
mas no seu exemplo seria para arrays com sequencia como 1,1,2,2,2,3,3,3;
e se fossem numeros aleatorios como
1,2,5,7,9,4,1,3,6,2,5?

Pois é… experimenta ordenar essa sequencia que você me passou!!

1,2,5,7,9,4,1,3,6,2,5

oredenando…

1,2,2,3,4,5,6,7,9

:wink:

Mas como vc disse não é para manter o valor até ele se tornar maior??
Ordenar seria pelo sort então antes de começa?

kaabah

obviamente… :lol:

No caso de achar elementos repetidos, acho que fica mais eficiente você ordenar seu array e depois percorre-lo uma unica vez verificando se tem elemento repetido.

(…)

Após ordenado, pegue seu primeiro elemento e saia varrendo.

Marky.Vasconcelos

Legal vou tentar criar um metodo pra isso por curiosidade

Marky.Vasconcelos

public class ArrayTeste { public static int[] num = {1,1,1,2,2,2,3,3,3,3,4,4,4,4,5}; static int a = 0; public static void main(String[] args) { for(int i = 0 ; i < num.length; i++){ if(a < num[i]){ a = num[i]; System.out.println(a); } } } }
é possivel usar sort em Arrays?
e como eu vou pegar os valores e passar pra outra array? ou deletar da primeira?

T

Serafim:
Boas pessoal, tenho um trabalho pra fazer mas tou com alguns problemas em relação aos arrays, preciso de fazer operações com arrays como se fossem conjuntos:

. como tirar os elementos repetidos int num array?
. como posso fazer operações de diferença, união e intersecção entre dois arrays?

espero q me possam ajudar, preciso mesmo de ajuda…

Atenção, professores - se este código for submetido dessa maneira, não aceitem :stuck_out_tongue:

import java.util.*;

/**
 * Atenção - isto não serve para seu trabalho de escola, porque
 * usa "java.util.Set" para implementar conjuntos (sets). 
 * Ele serve apenas para exemplificar o que você deveria ter de escrever.
 */
class Conjunto {
    private Integer[] valores;
    /** Auxiliar */
    private static Set<Integer> valoresNaoRepetidos (Integer[] valores) {
        Set<Integer> ret = new TreeSet<Integer>();
        ret.addAll (Arrays.asList (valores));
        return ret;
    }
    public static Conjunto interseccao (final Conjunto c1, final Conjunto c2) {
        Set<Integer> set1 = valoresNaoRepetidos(c1.valores);
        Set<Integer> set2 = valoresNaoRepetidos(c2.valores);
        set1.retainAll (set2);
        return new Conjunto (set1.toArray(new Integer[0]));
    }
    public static Conjunto uniao (final Conjunto c1, final Conjunto c2) {
        Set<Integer> set1 = valoresNaoRepetidos(c1.valores);
        Set<Integer> set2 = valoresNaoRepetidos(c2.valores);
        set1.addAll (set2);
        return new Conjunto (set1.toArray(new Integer[0]));
    }
    public Conjunto (Integer[] pValores) {
        Set<Integer> valoresNaoRepetidos = new TreeSet<Integer>();
        valoresNaoRepetidos.addAll (Arrays.asList (pValores));
        valores = valoresNaoRepetidos.toArray(new Integer[0]);
        
    }
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append ("{");
        
        for (int i = 0; i < valores.length - 1; ++i) {
            sb.append (valores [i]);
            sb.append (", ");
        }
        if (valores.length >= 1) {
            sb.append (valores [valores.length - 1]);
        }
        sb.append ("}");
        return sb.toString();
    }
    
}

class LicaoCasa2 {
    public static void main(String[] args) {
        Conjunto c1 = new Conjunto (new Integer[]{3, 1, 4, 1, 5, 9, 2, 6});
        Conjunto c2 = new Conjunto (new Integer[]{2, 7, 1, 8, 2, 8, 1, 8});
        System.out.println (c1);
        System.out.println (c2);
        System.out.println (Conjunto.uniao (c1, c2));
        System.out.println (Conjunto.interseccao (c1, c2));
    }
}
kaabah

http://java.sun.com/j2se/1.5.0/docs/api/java/util/Arrays.html

kaabah

uhuahauhauhaahuhuahuaha…

BOAAAA!!! :idea:

S

Como consigo ver se esse exemplo funciona? tnh q criar algum ficheiro .class?

Marky.Vasconcelos

cria ele em um bloco de notas salva com o NomeDaClasse.java

vai no Prompt de Comando vai até a pasta que ta o arquivo .java e escreve
javac NomeDaClasse.java
e pra executa
java NomeDaClasse

S

Nao sei o q se passa, nao consigo. aparece um erro.

S

Nao devia gravar em .class?

kaabah

Gravar o que? Primeiro deve compilar seu .java

S

Boas pessoal, dentro deste assunto de classes e construtores alguem tem um programa q sirva de exemplo pra uma base de dados de uma empresa ou supermercado?

S

ninguem me consegue ajudar?

Omeganosferatu

Acho que seu problema ta mais pra uma consultoria ou empresa de TI né amigão ?

S

nao. é tb pra um trab…

No exemplo que me deram mais em cima podem me esxplicar o que é
Set?

S

É q o meu problema é o seguinte:

tenho estes métodos pra implementar:

public class ArrayUtils {
/* Apresenta na consola os valores de “a”.
Ex: Se “a” contém os valores 2, 1 e 5, então o método apresenta
o array na forma [2, 1, 5] */

public void writeln(int[] a) { /* a implementar */ }

/* Retorna um array sem as repetições que possam existir em "a" */
public int[] removeDuplicates(int[] a) { /* a implementar */ }

/* NOTA: Os três métodos seguintes consideram os arrays como
		conjuntos (coleccções de inteiros sem repetições) */
		
/* Retorna um novo array, que contém os elementos que
	correspondem ao conjunto diferença entre "a" e "b" */
public int[] difference(int[] a, int[] b) { /* a implementar */ }

/* Retorna um novo array, que contém os elementos que
	correspondem ao conjunto intersecção entre "a" e "b" */
public int[] intersection(int[] a, int[] b) { /* a implementar */ }

/* Retorna um novo array, também sem repetições, que contém
	os elementos que correspondem ao conjunto união  entre "a" e "b" */
public int[] union(int[] a, int[] b) { /* a implementar */ }

}

e pra testar isso tnh isto:

public class Teste  {

public static void main(String[] args)  {

int[] array1 = {1,6,1,2,5};

int[] array2 = {3,1,1,3,44,2,1,1};

ArrayUtils au = new ArrayUtils();
System.out.print("Elementos do array1:");
	au.writeln(array1); 
	
	System.out.print("Elementos do array2:");
	au.writeln(array2);
	
	System.out.print("Retirar elementos repetidos do array1");
	array1 = au.removeDuplicates(array1); 
	au.writeln(array1);
	
	System.out.print("Retirar elementos repetidos do array2");
	array2 = au.removeDuplicates(array2);
	au.writeln(array2);
	
	System.out.println("Uniao dos elementos entre array1 e array2 ");
	int[] uniao = au.union(array1, array2);
	au.writeln(uniao);
	
	System.out.print("Interseccao dos elementos entre array1 e array2");
	int[] interseccao = au.intersection(array1, array2);
	au.writeln(interseccao);
	
	System.out.print("Diferenca dos elementos array2 e array1 ");
	int[] diferenca = au.difference(array2, array1);
	au.writeln(diferenca);
}

}

mas eu nao percebo nada disto :cry: :cry:

erickcellani

Serafim:
nao. é tb pra um trab…

No exemplo que me deram mais em cima podem me esxplicar o que é
Set?

claro…

oq vai dentro do <> é o tipo de dado que ele vai receber!!!

mas isso é da jdk 1.5 p/ frente!

:smiley:

S

Pois, ainda nao dei isso.
o meu trab é aquilo q tnh aqui em cima, mas nao percebo nada disto…

S

Ninguem me consegue ajudar?

S

Entao pessoal?

S

É q o meu problema é o seguinte:

tenho estes métodos pra implementar:

public class ArrayUtils { 
/* Apresenta na consola os valores de "a". 
Ex: Se "a" contém os valores 2, 1 e 5, então o método apresenta 
o array na forma [2, 1, 5] */ 

public void writeln(int[] a) { /* a implementar */ } 

/* Retorna um array sem as repetições que possam existir em "a" */ 
public int[] removeDuplicates(int[] a) { /* a implementar */ } 

/* NOTA: Os três métodos seguintes consideram os arrays como 
conjuntos (coleccções de inteiros sem repetições) */ 

/* Retorna um novo array, que contém os elementos que 
correspondem ao conjunto diferença entre "a" e "b" */ 
public int[] difference(int[] a, int[] b) { /* a implementar */ } 

/* Retorna um novo array, que contém os elementos que 
correspondem ao conjunto intersecção entre "a" e "b" */ 
public int[] intersection(int[] a, int[] b) { /* a implementar */ } 

/* Retorna um novo array, também sem repetições, que contém 
os elementos que correspondem ao conjunto união entre "a" e "b" */ 
public int[] union(int[] a, int[] b) { /* a implementar */ } 

}

e pra testar isso tnh isto:

public class Teste { 
public static void main(String[] args) { 
int[] array1 = {1,6,1,2,5}; 
int[] array2 = {3,1,1,3,44,2,1,1}; 
ArrayUtils au = new ArrayUtils(); 

System.out.print("Elementos do array1:"); 
au.writeln(array1); 

System.out.print("Elementos do array2:"); 
au.writeln(array2); 

System.out.print("Retirar elementos repetidos do array1"); 
array1 = au.removeDuplicates(array1); 
au.writeln(array1); 

System.out.print("Retirar elementos repetidos do array2"); 
array2 = au.removeDuplicates(array2); 
au.writeln(array2); 

System.out.println("Uniao dos elementos entre array1 e array2 "); 
int[] uniao = au.union(array1, array2); 
au.writeln(uniao); 

System.out.print("Interseccao dos elementos entre array1 e array2"); 
int[] interseccao = au.intersection(array1, array2); 
au.writeln(interseccao); 

System.out.print("Diferenca dos elementos array2 e array1 "); 
int[] diferenca = au.difference(array2, array1); 
au.writeln(diferenca); 
} 
}

mas eu nao percebo nada disto :cry: :cry:
Alguem me consegue ajudar na parte dos repetidos?

S

É q sem saber a parte dos repetidos nao da pra fazer o resto, por favor ajudem me tnh q entregar este trab hj… :cry: :cry:

S

Va la pessoal, ajudem me, nao consigo fazer a parte do removeduplicates…

seufagner

Pode parecer idiota, mas pela inocência da tua pergunta:

A linguagem que você tem que utilizar é Java?

Você pode utilizar Collections? Isto facilitaria tua vida… Em caso afirmativo, ganha um tempo lendo.

[]s

Criado 10 de maio de 2007
Ultima resposta 10 de mai. de 2007
Respostas 35
Participantes 10