2010-12-04 6 views
12

Как создать список (или какой-либо другой тип контейнера) пар целых и строк, который позволяет дублировать в обеих парах и может быть отсортирован по целочисленному значению?Как создать отсортированный список целых чисел и пар строк?

Мне нужно заполнить контейнер именами (строками) и парными (целочисленными), контейнер должен разрешать дублирующиеся значения как по имени, так и по счету, и мне нужно отсортировать этот список по значению.

Я попытался с SortedMap, но не допускает дублирующиеся значения:

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"); 

В этом примере, ferca и Педро имеют то же значение выигрыша, это то, что мне нужно, чтобы позволить, но SortedMap переписывает " ferca "с" Pedro ".

Каков наилучший тип контейнера для этого?

+1

если вы разрешите дублировать имена, как бы вы сказали, какие два имени друг от друга? – 2010-12-04 13:01:07

ответ

11

Поскольку вы хотите, чтобы ваша коллекция была заказана, я предлагаю вам использовать List и Collections.sort.Если вы решили пойти на этот подход у вас еще есть два варианта:

  • Создание пользовательского Comparator, который может быть передан в качестве аргумента sort или
  • Пусть вспомогательный Score класс реализации Comparable<Score>

Ниже приведен пример, и ideone demo последнего подхода:

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

Если вы хотите получить список, используйте список ...

Самый лучший вариант, вероятно, будет создать свой собственный тип инкапсуляции строку и целое число, добавить свои собственные сравнения, и положи их в ArrayList<T> ,

Отсортируйте его, когда вам нужно с Collections.sort.

Если вам не нужно, чтобы дубликаты, которые имеют такое же имя и счетов, вы могли бы использовать SortedSet вместо этого, так долго, как ваших родов порядка сравнения на оба счет и имени.

6
  1. Создать class что вложить эти два поля
  2. создать пользовательский Comparator, что сравнение двух объектов на основе Int значения.
  3. Создать list этого объекты
  4. Collection.sort(); проход OBJ из comparator здесь

    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() ; 
        } 
    } 
    

Примечание: Это просто модель, чтобы показать основную идею

+1

Я предлагаю вам не реализовывать интерфейс raw Comparator и вместо этого использовать `Comparator ``. Это более типично, и вам не нужно вводить аргументы. – aioobe 2010-12-04 13:39:39

0

После вы создаете тип холдинга, альтернативная структура - PriorityQueue для хранения элементов. Это отличается от Collections.sort(), потому что элементы вставлены в порядке, либо высокие, либо низкие значения поднимаются вверх.

Единственное, что вам нужно сделать, это написать Компаратор для перехода на PriorityQueue на instanciation, поэтому он знает, как отсортировать элементы на основе целочисленного значения.

Оба метода и Collections.sort() обеспечивают одинаковые результаты различными способами. Они также работают в O (N log N) времени.

Смежные вопросы