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 ?
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
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
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:
[code]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 + " ");
}
}
}[/code]
Simplificando:
[code]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] );
}[/code]
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;
}
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!!!
Utilizando a sugestão do marcuskbra:
[code] 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;
}[/code]
Eu achei que ficou limpinho...
flws
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”.
Da forma que o amigo bertu disse parecia que tinha que remover o brasil tbm.
A solução do Vini é a mais limpa.
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.
Leia o que ele diz dois posts abaixo do código q vc postou.
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.
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.
Leia o que ele diz dois posts abaixo do código q vc postou.[/quote]
Ja corrigi o meu post