2010-01-21 16 views
9

¿Es posible permitir valores duplicados en la colección Establecer?¿Valores duplicados en la colección Establecer?

¿Hay alguna manera de hacer que los elementos sean únicos y tener algunas copias de ellos? ¿Hay alguna función para Set collection por tener valores duplicados en ella?

+1

¿Por qué desea almacenar valores múltiples en un conjunto? Tal vez sea útil un ejemplo de lo que estás tratando de lograr. – Cuga

+4

Creo que malinterpretaste el significado completo del término ** Conjunto **. Use una lista si quiere duplicados. – BalusC

Respuesta

25

¿Alguna vez ha considerado utilizar un java.util.List?

De lo contrario, recomendaría un Multiset de Google Guava (el sucesor de Google Collections, que esta respuesta originalmente recomendada -ed.).

+1

¿Hay alguna forma de hacer algo con Set y tener múltiples valores? – Johanna

+5

@Roger, su enlace Multiset apunta a una versión antigua del código fuente. Aquí hay un enlace a la versión más reciente de javadoc: http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/collect/Multiset.html –

+1

Rojer tiene razón. Pruebe java.util.List (preffered) alguna biblioteca de terceros. Además de la API de colecciones de Google, puede utilizar las Colecciones de Apache Commons sin nombre de usuario/contraseña. Ver mi respuesta a continuación. –

1

No creo que pueda tener valores duplicados dentro de un conjunto. Un conjunto se define como una colección de valores únicos. Puede que sea mejor usar una ArrayList.

0

No lo creo. La única forma sería usar una lista. También puede engañar con la función equals(), hashcode() o compareTo() pero va a ser incómodo.

12

El muy definition de un Set no permite duplicados. Creo que quizás desee utilizar otra estructura de datos, como List, que permitirá dups.

¿Hay alguna manera de hacer que los elementos sean únicos y tener algunas copias de ellos?

Si por alguna razón que realmente hace necesidad de almacenar duplicados en un conjunto, ya sea que usted necesita para envolverlos en una especie de objeto del contenedor, o bien sobrescribir equals() y hashCode() de su modelar objetos para que no se evalúen como equivalentes (e incluso que fallará si intenta almacenar referencias al mismo objeto físico varias veces).

Creo que necesita volver a evaluar lo que está tratando de lograr aquí, o al menos explicárselo con mayor claridad.

0

ninguna posibilidad .... no se puede tener valores duplicados en la interfaz conjunto ... Si desea duplicados entonces puede intentar Matriz-Lista

2

De los javadocs:

"conjuntos contener ningún par de elementos E1 y E2 tal que e1.equals (E2), y al sumo un elemento null"

Así que si sus objetos eran para anular. equals() para que devuelva diferentes valores para cualquier objeto que pretenda almacenar, luego puede almacenarlos por separado en un Set (también debe reemplazar el hashcode()).

Sin embargo, la definición misma de un Set en Java es,

"Una colección que no contiene elementos duplicados."

Así que usted es realmente mejor usar una o List algo más aquí.Tal vez un Map, si desea almacenar valores duplicados basados ​​en claves diferentes.

2

vista de Sun en "bolsas" (conjuntos múltiples AKA):

Estamos muy comprensivo con el deseo de colecciones tipo de fallos. En lugar de agregar una "curita" al marco que refuerza la seguridad de tipo de manera ad hoc, el marco ha sido diseñado para adaptarse a todas las propuestas de tipos parametrizados que se discuten actualmente. En caso de que los tipos parametrizados se agreguen al idioma, toda la infraestructura de colecciones admitirá el uso seguro de tipo de tiempo de compilación, sin necesidad de conversiones explícitas. Desafortunadamente, esto no sucederá en la versión 1.2. Mientras tanto, las personas que deseen seguridad en el tipo de tiempo de ejecución pueden implementar sus propias funciones de compuerta en las colecciones "envoltura" que rodean las colecciones JDK.

(source; tenga en cuenta que es viejo y posiblemente -ed obsoleto.)

Aparte de API de colecciones de Google, puede utilizar Apache Commons Collections.

Apache Commons Colecciones:

http://commons.apache.org/collections/

Javadoc for Bag

+1

Esas palabras ("La vista del sol") fueron escritas por Josh Bloch hace mucho tiempo. Desde entonces, cambió su tono y, en esencia, co-diseñó Google Collections 'Multiset. –

+0

Lo que Sun significa esencialmente en la declaración anterior es que es muy raro que ocurra este tipo de escenario, pero si alguna aplicación realmente necesita algo como esto, puede implementarse de manera personalizada o utilizando una biblioteca de terceros (por ejemplo, colecciones Apache o colecciones de Google).) que lo hace en lugar de saturar la API central con él. Y no creo que Sun haya cambiado esta visión de todos modos, ya que los "bolsos" (también conocidos como "bolsas") aún no forman parte de JRE a partir del último Java-6. –

0

Como se mencionó elegir la colección adecuada para la tarea y es probable que una lista se lo necesita. En general, confundir con equals(), hashcode() o compareTo() para romper la identidad es una mala idea, simplemente para insertar una instancia en la colección incorrecta. Peor aún, puede romper el código en otras áreas de la aplicación que dependen de estos métodos para producir resultados de comparación válidos y ser muy difícil de depurar o rastrear tales errores.

0

Esta pregunta me fue formulada también en una entrevista. Creo que la respuesta es, por supuesto, que Set no permitirá elementos duplicados y, en su lugar, ArrayList u otras colecciones deberían usarse para el mismo, sin embargo, anular equals() para el tipo de objeto almacenado en el conjunto te permitirá manipular en la comparación lógica. Y, por lo tanto, puede almacenar elementos duplicados en el Conjunto. Es más un hack, que permitiría elementos no únicos en el conjunto y, por supuesto, no se recomienda en el código de nivel de producción.

0

Puede hacerlo por razones imperiosas de código hash como se indica a continuación:

public class Test 
{ 
    static int a=0; 

    @Override 
    public int hashCode() 
    { 
     a++; 
     return a; 
    } 

    public static void main(String[] args) 
    { 
     Set<Test> s=new HashSet<Test>(); 
     Test t1=new Test(); 
     Test t2=t1; 
     s.add(t1); 
     s.add(t2); 
     System.out.println(s); 
     System.out.println("--Done--"); 
    } 
} 
+1

por favor explique más explicando – johannes

+0

Esto viola las postcondiciones de hashcode, p. que es persistente para cada objeto ... lo cual es una manera algo pedante de decir "este es un conjunto totalmente roto con el que realmente no se puede hacer nada". – djechlin

+0

Eso es bastante feo. Rompe el contrato de hashCode() y equals(). –

-1
public class SET { 

    public static void main(String[] args) { 
     Set set=new HashSet(); 
     set.add(new AB(10, "[email protected]")); 
     set.add(new AB(10, "[email protected]")); 
     set.add(new AB(10, "[email protected]")); 
     Iterator it=set.iterator(); 
     while(it.hasNext()){ 
      Object o=it.next(); 
      System.out.println(o); 
     } 
    } 
} 

public class AB{ 

    int id; 
    String email; 

    public AB() { 
     System.out.println("DC"); 
    } 

    AB(int id,String email){ 
     this.id=id; 
     this.email=email; 
    } 

    @Override public String toString() { 
     // TODO Auto-generated method stub return ""+id+"\t"+email;} 
    } 
} 
+0

Esos no son elementos duplicados, porque 'a.equals (b)' devuelve falso. También recomendaría hacer algunos formateos de código. – corsiKa

+0

Formatea ese código y explica lo que hace. – ElderMael

+0

Si bien este fragmento de código puede resolver la pregunta, [incluyendo una explicación] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) realmente ayuda a mejorar la calidad de su publicación. Recuerde que usted está respondiendo la pregunta a los lectores en el futuro, y es posible que esas personas no sepan los motivos de su sugerencia de código. – msrd0

0

Estos suenan como preguntas de la entrevista, así que voy a responder a ellos como preguntas de la entrevista ...

Is it possible to allow duplicate values in the Set collection? 

Sí, pero requiere que la persona que implementa el Set viole el contrato de diseño sobre el cual se construye Set. Básicamente, podría escribir una clase que extienda Set y no haga cumplir las promesas de Set.

Además, otras violaciones son posibles. Podría utilizar una implementación Set que se basa en el contrato de Java hashCode().Entonces, si proporcioné un Object que viola el contrato de código hash de Java, podría colocar dos objetos en el conjunto que son iguales, pero generar diferentes códigos hash (porque es posible que no se verifiquen en igualdad uno contra el otro debido a estar en un cubo de hash diferente . cadenas

Is there any way to make the elements unique and have some copies of them? 

básicamente depende de cómo se defina singularidad Si la singularidad de un objeto está determinado por su valor, entonces uno puede tener múltiples copias del mismo objeto único;. Sin embargo, si la singularidad del objeto está determinado por su Por ejemplo, entonces, por definición, no sería posible tener varias copias del mismo objeto. Sin embargo, podría tener múltiples referencias a ellas.

Is there any functions for Set collection for having duplicate values in it? 

La interfaz Set no tiene ninguna función para detectar/informar duplicados; sin embargo, se basa en la interfaz Colecciones, que debe admitir la interfaz de la Lista, por lo que es posible pasar duplicados a un Conjunto; sin embargo, una Set correctamente implementada simplemente ignorará los duplicados y presentará una copia de cada elemento determinado como único.

Cuestiones relacionadas