Подтвердить что ты не робот

Как создать отсортированный список целых чисел и пар строк?

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

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

Я попытался с 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 и Pedro имеют одинаковое значение, это нужно, но SortedMap перезаписывает "ferca" с "Pedro".

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

4b9b3361

Ответ 1

Поскольку вы хотите, чтобы ваша коллекция была заказана, я предлагаю вам использовать 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);
    }
}

Ответ 2

  • Создайте class, которые заключают эти два поля
  • создайте пользовательский Comparator, который сравнивает два объекта на основе значения int.
  • Создайте list этих объектов
  • Collection.sort(); передать объект 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() ;
      }
    }
    

Примечание. Это всего лишь модель, показывающая основную идею

Ответ 4

Если вам нужен список, используйте список...

Лучшим вариантом, вероятно, будет создание собственного типа для инкапсуляции строки и целого числа, добавление собственного сравнения и размещение их в ArrayList<T>.

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

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

Ответ 5

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

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

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