Array Collections - [RESOLVIDO]

package teste;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;

public class Teste {
	
	public static void main(String[] args) {
		
		Collection lista = new ArrayList();
		lista.add("1");
		lista.add("2");
		lista.add("4");
		lista.add("5");
		lista.add("1");
		lista.add("1");
		
		lista = Collections.singleton(new HashSet(lista));
		
		for (Object object : lista) {
			System.out.println(object.toString());
		}
	}
}

Minha dúvida é o seguinte, por exemplo como imprimir apenas o elemento repetido e apenas um vez, no exemplo acima só seria impresso o numero 1, que repete 3 vezes, e seria apenas impresso 1 vez, informando que o unico que repetiu foi o 1. No código que postei acima faz o contrário que quero, ele verifica os repetido e exclui, deixando somente números sem respetição…alguém poderia me ajudar ???

Você pode criar um HashSet chamado ‘numerosImpressos’, quando você iterar sobre a lista você verifica se o número foi inserido no HashSet. Se não foi inserido você imprime e adiciona no HashSet, caso contrário, você continua o loop.

Você também pode criar um HashMap (HashMap<String, Integer>) onde a chave é o número impresso, e o valor é o contador de números repetidos. Ai para cada número que adicionar atualiza o seu contador.

poderia por favor me passar mais detalhes como exemplo, ou indicar um local onde posso entender melhor a questão citada ??? agradeço a todos !!!

Fiz um exemplo para você ter idéia do uso do hash para utilizar o contador. Agora é só você aplicar a sua lógica…

public class Teste {  
      
    public static void main(String[] args) {  
          
        Collection<Integer> lista = new ArrayList<Integer>();  
        lista.add(1);  
        lista.add(2);  
        lista.add(4);  
        lista.add(5);  
        lista.add(1);  
        lista.add(1);  

        Map<Integer, Integer> map = new HashMap<Integer, Integer>();
        
        for (Integer l : lista) {
        	int count = map.get(l) != null ? map.get(l) : 0;
        	map.put(l, ++count);
        }
       
        for (Integer n : map.keySet()) {
        	System.out.printf("O número %d repetiu %d vez(es)\n", n, map.get(n));
        }
    }  
} 

valeu, obrigado, vou testar aqui… mas ajudou 100%…vlw

Bom amigo, verifiquei aqui bastante interessante, porém esse método não exclui os números repetidos da lista, deixando apenas os repetidos, que eu quero é exluir o que não são repetidos, e deixar os que são repetidos porém uma única vez, ex: tem 2,3,4,4,4 … no conjunto seria somente 4…entendeu ??? obrigado mais uma vez !

  1. Copie todos os números da lista num set.
  2. Remova da lista todos os números do set;
  3. Copie toda a lista para outro set.

O set final tem o que você quer.

E, por favor, quando for postar tópicos, não use palavras como “URGENTE”, “IMPORTANTE”, “PLEASE” no título.
O fórum não é local de urgências, e isso mostra que você quer mais destaques do que os demais usuários, o que é considerado falta de etiqueta.

Realmente é urgente, mas tudo bem já entendi…

Em relação a dica que você me passou, poderia me passar um exemplo de como usar esse set, não estou entendo como fazer o set que você me falou… obrigado mais uma vez.

[quote=felipehts]Realmente é urgente, mas tudo bem já entendi…

Em relação a dica que você me passou, poderia me passar um exemplo de como usar esse set, não estou entendo como fazer o set que você me falou… obrigado mais uma vez.[/quote]

Pelo que ele falou parece ser assim, mas me perdi na lógica então, porque retorna 2,1,5,4:

[code]package teste;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;

public class Teste {

public static void main(String[] args) {  
      
	ArrayList<String> lista = new ArrayList<String>();  
    lista.add("1");  
    lista.add("2");  
    lista.add("4");  
    lista.add("5");  
    lista.add("1");  
    lista.add("1");  
    
    Set<String> set = new HashSet<String>(); 
    
    set.addAll(lista);
    lista.removeAll(set);
    set.addAll(lista);
       
    for (Object object : set) {  
        System.out.println(object.toString());  
    }  
}  

} [/code]

[quote=rcipriani][quote=felipehts]Realmente é urgente, mas tudo bem já entendi…

Em relação a dica que você me passou, poderia me passar um exemplo de como usar esse set, não estou entendo como fazer o set que você me falou… obrigado mais uma vez.[/quote]

Pelo que ele falou parece ser assim, mas me perdi na lógica então, porque retorna 2,1,5,4:

[code]package teste;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;

public class Teste {

public static void main(String[] args) {  
      
	ArrayList<String> lista = new ArrayList<String>();  
    lista.add("1");  
    lista.add("2");  
    lista.add("4");  
    lista.add("5");  
    lista.add("1");  
    lista.add("1");  
    
    Set<String> set = new HashSet<String>(); 
    
    set.addAll(lista);
    lista.removeAll(set);
    set.addAll(lista);
       
    for (Object object : set) {  
        System.out.println(object.toString());  
    }  
}  

} [/code][/quote]

Neste exemplo acima do conjunto dos números: “1,2,4,5,1,1” eu gostaria que retornasse apenas o número 1, já que é o unico que repeti, porém mesmo respetindo varias vezes, quero que retorne apenas uma vez o número repetido …ou seja retorna somente uma vez o “1”…E PRONTO…mas nada…vlw ai
OBS:meu trabalho é sobre conjuntos, então gostaria de pegar apenas a intercessão dos conjuntos, ou seja apenas o que tem em comum…entendi…vlw

Quase. Eu quis dizer isso aqui:

[code]

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;

public class Teste {

public static void main(String[] args) {

	ArrayList<String> lista = new ArrayList<String>();
    lista.add("1");
    lista.add("2");
    lista.add("4");
    lista.add("5");
    lista.add("1");
    lista.add("1");

    //Copiar a lista para um set. Isso dará todos os elementos, 
    //sem duplicação
    Set<String> set = new HashSet<String>(lista);

    //Eliminar a primeira ocorrência daquele elemento da lista
    //Com isso, só as duplicações sobrarão. 
    for (String element : set)
        lista.remove(element);

    //Copiar o resultado para um set.
    //Isso garante que elementos que apareciam mais de 2 vezes agora só apareçam uma única vez.
    Set<String> set2 = new TreeSet<String>(lista);

    for (String element : set2) {
        System.out.println(element);
    }
}

}[/code]

O método removeAll não pode ser usado nesse caso, pois ele remove todas as ocorrências de uma String na lista, não só a primeira.

[quote=felipehts]Neste exemplo acima do conjunto dos números: “1,2,4,5,1,1” eu gostaria que retornasse apenas o número 1, já que é o unico que repeti, porém mesmo respetindo varias vezes, quero que retorne apenas uma vez o número repetido …ou seja retorna somente uma vez o “1”…E PRONTO…mas nada…vlw ai
OBS:meu trabalho é sobre conjuntos, então gostaria de pegar apenas a intercessão dos conjuntos, ou seja apenas o que tem em comum…entendi…vlw [/quote]

Só faz sentido falar em interseção, se você tiver dois conjuntos. Como você falou, precisa ter “algo em comum”.
Nesse caso, você tem apenas um único conjunto, então, não existe interseção nenhuma.

A classe Set representa justamente um conjunto, onde seus elementos internos não se repetem.

Só um último parênteses.

Todas as collections tem um método para interseção de conjuntos.

Chama-se retainAll:

[code]Set conjunto1 = new TreeSet();
conjunto1.add(1);
conjunto1.add(2);
conjunto1.add(5);
conjunto1.add(9);
conjunto1.add(10);
conjunto1.add(1);
conjunto1.add(3);

Set conjunto2 = new TreeSet();
conjunto2.add(1);
conjunto2.add(2);
conjunto2.add(4);
conjunto2.add(8);

//Tiramos uma cópia do conjunto1
Set conjunto3 = new TreeSet(conjunto1);
conjunto3.retainAll(conjunto2);
System.out.println(conjunto3);

//Como a interseção é comutativa, o inverso dará o mesmo resultado
Set conjunto4 = new TreeSet(conjunto2);
conjunto4.retainAll(conjunto1);
System.out.println(conjunto4);
[/code]

Obviamente, como eu falei, só tem sentido falar em interseção se você tem dois conjuntos.

[quote=ViniGodoy]Só um último parênteses.

Todas as collections tem um método para interseção de conjuntos.

Chama-se retainAll:

[code]Set conjunto1 = new TreeSet();
conjunto1.add(1);
conjunto1.add(2);
conjunto1.add(5);
conjunto1.add(9);
conjunto1.add(10);
conjunto1.add(1);
conjunto1.add(3);

Set conjunto2 = new TreeSet();
conjunto1.add(1);
conjunto1.add(2);
conjunto1.add(4);
conjunto1.add(8);

//Tiramos uma cópia do conjunto1
Set conjunto3 = new TreeSet(conjunto1);
conjunto3.retainAll(conjunto2);
System.out.println(conjunto3);

//Como a interseção é comutativa, o inverso dará o mesmo resultado
Set conjunto4 = new TreeSet(conjunto2);
conjunto4.retainAll(conjunto1);
System.out.println(conjunto4);
[/code]

Obviamente, como eu falei, só tem sentido falar em interseção se você tem dois conjuntos.[/quote]

Obrigado pela aula ! Realmente era isso quer precisava, porém testei aqui, e a impressão foi essa:
“run:
[]
[]
CONSTRUÍDO COM SUCESSO (tempo total: 0 segundos)”
ficou vazio a impressão, sabe me dizer o porque ?? vlw obrigado.

Falha de copy&paste. Note ali em cima que na hora de colocar itens no conjunto 2, coloquei no conjunto 1. LOL

Já corrigi no meu post.

[quote=ViniGodoy]Falha de copy&paste. Note ali em cima que na hora de colocar itens no conjunto 2, coloquei no conjunto 1. LOL

Já corrigi no meu post.[/quote]

Era isso mesmo que precisava, agora vou implementar aqui a lógica no meu trabalho… vlw mesmo …obrigado mais um vez…