2010-12-04 9 views
12

¿Cómo puedo crear una lista (o algún otro tipo de contenedor) de pares enteros y cadenas que permita duplicados en ambos pares y que puedan ordenarse por el valor entero?¿Cómo puedo crear una lista ordenada de pares enteros y de cadena?

Necesito llenar un contenedor con pares de nombres (cadena) y puntuación (enteros), el contenedor debe permitir valores duplicados tanto en nombre como en puntuación, y necesito ordenar esta lista por el valor de puntuación.

me trataron con una SortedMap pero no permite valores duplicados:

SortedMap<Integer,String> sm=new TreeMap<Integer, String>(); 

sm.put(23, "Peter"); 
sm.put(11, "Tony"); 
sm.put(110, "Claire"); 
sm.put(13, "ferca"); 
sm.put(55, "Julian"); 
sm.put(13, "Pedro"); 

En este ejemplo, Ferca y Pedro tienen el mismo valor de puntuación, esto es algo que necesito para permitir, pero el SortedMap sobrescribe " ferca "con" Pedro ".

¿Cuál es el mejor tipo de contenedor para hacer esto?

+1

si permite nombres duplicados, ¿cómo distinguiría qué dos nombres aparte? –

Respuesta

11

Dado que desea pedir su colección, le sugiero que use un List y Collections.sort.Si usted decide ir a por este enfoque todavía tiene dos opciones:

  • Crea una alfombrilla de Comparator que se puede pasar como argumento para sort, o
  • Vamos la clase auxiliar Score implementar Comparable<Score>

Aquí es un ejemplo y ideone demo de este último enfoque:

import java.util.*; 

class Score implements Comparable<Score> { 
    int score; 
    String name; 

    public Score(int score, String name) { 
     this.score = score; 
     this.name = name; 
    } 

    @Override 
    public int compareTo(Score o) { 
     return score < o.score ? -1 : score > o.score ? 1 : 0; 
    } 
} 

public class Test { 

    public static void main(String[] args){ 
     List<Score> scores = new ArrayList<Score>(); 

     scores.add(new Score(23, "Peter")); 
     scores.add(new Score(11, "Tony")); 
     scores.add(new Score(110, "Claire")); 
     scores.add(new Score(13, "ferca")); 
     scores.add(new Score(55, "Julian")); 
     scores.add(new Score(13, "Pedro")); 

     Collections.sort(scores); 
    } 
} 
0

Si desea una lista, utilice una lista ...

La mejor opción sería probablemente para crear su propio tipo de encapsular la cadena y el entero, añadir su comparación, y ponerlos en un ArrayList<T> .

Ordénelo cuando lo necesite con Collections.sort.

Si no es necesario para permitir que los duplicados que tienen el mismo nombre y puntuación, se puede utilizar un SortedSet lugar, siempre y cuando su tipo de orden de comparación tanto en la puntuación de y nombre.

6
  1. Crear una class que encierran estos dos campos
  2. Crea una alfombrilla de Comparator que compara dos objetos basados ​​en el valor int.
  3. Crear una list de que los objetos
  4. Collection.sort(); pase obj de comparator aquí

    class MyEntity{ 
        int val; 
        String name; 
    } 
    
    
    List<MyEntity> list = new ArrayList<MyEntity>(); 
    list.add(new MyEntity(1,"a")); 
    list.add(new MyEntity(4,"z")); 
    list.add(new MyEntity(2,"x")); 
    Collections.sort(list,new MyComparator()); 
    
    
    class MyComparator implements Comparator<MyEntity>{ 
        public int compare(MyEntity ob1, MyEntity ob2){ 
        return ob1.getVal() - ob2.getVal() ; 
        } 
    } 
    

Nota: Esto es sólo modelo para mostrar la idea básica

+1

Sugiero que no implemente la interfaz del comparador sin formato y use 'Comparator ' en su lugar. Es más seguro y no necesitas lanzar los argumentos. – aioobe

+0

@aioobe Gracias amigo, actualizado –

+0

error: el constructor MyEntity en la clase MyEntity no se puede aplicar a tipos determinados; list.add (new MyEntity (1, "a")); – David

0

Después crea un tipo de retención, una estructura alternativa es PriorityQueue para contener los artículos. Esto difiere de Collections.sort() porque los elementos se insertan en orden, con los valores altos o bajos subiendo a la parte superior.

Lo único que tienes que hacer es escribir un comparador para pasar al PriorityQueue en la instanciación, por lo que sabe ordenar los elementos basándose en el valor entero.

Tanto este método como Collections.sort() ofrecen los mismos resultados con diferentes formas de hacerlo. También se ejecutan en el tiempo O (N log N).

Cuestiones relacionadas