Problemas com arrays!

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…

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

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.

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:

entao pessoal ninguem tem ideias?

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…

Obrigadao, de certeza q me vai ajudar…

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

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:

[quote=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: [/quote]

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?

[quote]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? [/quote]

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:

[quote=kaabah] [quote]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? [/quote]

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: [/quote]

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?

obviamente… :lol:

[quote]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. [/quote]

Legal vou tentar criar um metodo pra isso por curiosidade

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?

[quote=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…[/quote]

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

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

uhuahauhauhaahuhuahuaha…

BOAAAA!!! :idea:

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

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