Retirar String repetidas de um Array

13 respostas
B

Como que eu faço pra retirar um String repetida de um array ? por exemplo tenho um array {“brasil”,“java”,“obama”,“brasil”}
da ele retirar os repetidos e imprimir o resto! no caso deletaria o brasil !
alguem tem alguma ideia ?

13 Respostas

M

transforma seu array em um Set, por exemplo HashSet…
a interface Set não permite elementos repetidos…
da uma pesquisada aki no forum…
segue o link da api java.sun.com/j2se/1.5.0/docs/api/java/util/Set.html

Abçs

B

Bom num sei se seria a melhor forma, mais vc poderia passar o seu arrray em HashSet que não aceita repitidos e depois caso vc realmente queira o array, tem um metodo toArray() que te retorna seu array sem repitidos
Abraços

J

Galera,

Pelo que eu entendi o que ele quer é ter como entrada um array assim {"brasil","java","obama","brasil"} e ter como saída um array assim ô: {"java","obama"}. Se for isso segue o código abaixo:

import java.util.Arrays;

public class SemRepeticao {  
 
	public static String[] subst(String[] array) {
		
		Arrays.sort(array);
		String[] lista = new String[array.length];
		
		// parte central do algoritmo
		int j = 0;
		for (int i = 0; i < array.length; i++) {
		      if ((i > 0) && (array[i] == array[i - 1])) continue;
		      if ((i < array.length - 1) && (array[i] == array[i + 1])) continue;
		      lista[j++] = array[i];		      		      
		}
		
		// se tinha elementos repetidos
		if (j != array.length){
			String[] newLista = new String[j];
			System.arraycopy(lista, 0, newLista, 0, j);
			return newLista;
		}

		return lista;
	}  
	
	public static void main(String[] args) {
		String[] lista = subst(new String[]{"brasil", "java", "obama", "brasil"});
		for (String dado : lista) {
			System.out.print(dado + " ");
		}
	}
}
D

Simplificando:

public static String[] removeRepetitions( String[] strArray ) {

    List< String > list = new ArrayList< String >();
    int c;

    for ( String si : strArray ) {
        c = 0;
        for ( String sj : strArray ) {
            if ( sj.equals( si ) ) {
                if ( ++c > 1 ) {
                    break;
                }
            }
        }
        if ( c == 1 ) {
            list.add( si );
        }
    }

    return list.toArray( new String[0] );

}
B

vlw de acordo com o post do davidbuzatto, eu alterei e montei meu propio algoritmo!!

public static String[] retiraRepetidos(String[] array) { 
		Arrays.sort(array);
		String[] lista = new String[array.length];
		int j = 0;
		for (int i = 0; i < array.length; i++) {  
			if ((i > 0) && (array[i].equals(array[i - 1])) && (array[i].equals(array[i + 1]))) continue;
			if ((i < array.length - 2) && (array[i].equals(array[i + 2]))) continue;
		    lista[j++] = array[i];		      		      
		}
		if (j != array.length){
			String[] newLista = new String[j];
			System.arraycopy(lista, 0, newLista, 0, j);
			return newLista;
		}
		return lista;
	}
B

ixii nao tinha visto voce ja tinha respondido, o problema que do primeiro jeito que voce postou ele retirava as 2 String repetidas no Array, eu queria que caso tivesse 2 brasil, apagaria um e deixaria um! se tivesse 3 apagaria 2 e deixaria 1 ! eu montei desse jeito e funcionou nao sei da uma olhada e me fala ae q q vc axou!!!

F

Utilizando a sugestão do marcuskbra:

public String[] soPodeHaverUm(String[] nomes) {
        
        HashSet<String> hsNomes = new HashSet<String>();
        
        for(String n : nomes) {
            hsNomes.add(n);
        }
        
        int i = 0;
        
        String[] novosNomes = new String[hsNomes.size()];
        
        for(String nome : hsNomes) {
            novosNomes[i++] = nome;
        }

        return novosNomes;
    }

Eu achei que ficou limpinho...

flws

V

Que tal assim?

public class RemoveRepeteco {
    public static void main(String[] args) {
        String[] array = { "brasil", "java", "obama", "brasil" };
        
        array = new HashSet<String>(Arrays.asList(array))
                .toArray(new String[0]);
        
        for (String str : array)
            System.out.println(str + " ");
    }
}

É só uma variação do código do fantomas, usando o que já tem pronto na API.

Se quiser que o resultado saia ordenado, só troque a palavra “HashSet” por “TreeSet”.

D

Da forma que o amigo bertu disse parecia que tinha que remover o brasil tbm.
A solução do Vini é a mais limpa.

P

Vc poderia criar um MAPA cuja chave é String e o valor é a quantidade de ocorrencias.

Depois poderia filtrar o MAPA para aquelas strings que acontecem X vezes ou apenas iterar sobre o mapa para mostrar os valores distintos.

V

Leia o que ele diz dois posts abaixo do código q vc postou.

J

Oops, então eu é que não tinha entendido direito. A resposta do ViniGodoy é a melhor solução pro o caso de se eliminar somente a repetição. Sem dúvida é a melhor solução de todas vistas aqui, e seu tivesse entendido (burrice minha) teria feito como ele fez, isto é, usando Set. Mesmo assim gostei do exercício de bolar um algoritmo eficiente para retirar aqueles repetidos. :smiley:

A solução do davidbuzatto é simples, MAS acontece que ela tem complexidade computacional quadrática (O(n^2)) enquanto a minha tinha linear (O(2N)), além de utilizar somente arrays. Se vc tiver um vetor de 1.000 elementos o algoritmo dele vai fazer 1.000.000 de comparações (!!), e isto em algumas situações é inaceitável.

D

Leia o que ele diz dois posts abaixo do código q vc postou.

Ja corrigi o meu post :smiley:

Criado 5 de novembro de 2008
Ultima resposta 6 de nov. de 2008
Respostas 13
Participantes 8