2016-12-21 2 views
2

Итак, я ученик программиста на C++, и я начинаю изучать Java, и я хотел бы прочитать класс Candidate с двумя строковыми значениями (Name и ID), и я хотел бы Храните эти Кандидаты в контейнере.Java Сортировка во время чтения

Что будет лучшим контейнером для использования в этой ситуации, и что я могу использовать для хранения этих значений при сортировке их по имени.

Поскольку я привык к библиотеке STL, я думал о чем-то вроде вектора или списка.

Спасибо!

+3

Если вам не нужно разрешать дубликаты, я бы, вероятно, использовал «TreeSet». –

+1

Просьба пояснить вариант использования. Является ли сортировка важной особенностью? Вы упомянули вектор STL или список, которые по умолчанию не сортируются. – shiri

+0

Этот вопрос почти наверняка был дан ответ несколько раз раньше, поэтому охота вокруг Stack Overflow для вопросов о сортировке пользовательских типов. «TreeSet ' с настраиваемым «Comparator», переданным его конструктору, выполнит задание, и здесь обязательно будут ответы на SO, которые приводят пример кода для этого. – Bobulous

ответ

-5

Посмотрите на SortedMap и SortedList.

+2

«SortedList», который не существует в основной Java, противоречит концепции «List». См. Http://stackoverflow.com/questions/8725387/why-is-there-no-sortedlist-in-java – Zircon

+0

Моя ошибка. Думал о TreeSet, имел отрыжку мозга. – arcy

+0

Вопрос: «Какой будет лучший контейнер для использования в этой ситуации, и что я могу использовать для хранения этих значений при сортировке их по имени». TreeSet, который я хотел сказать, как указано в комментарии, исправляющем мои ошибка и SortedMap, которые я сказал, являются ответами на этот вопрос. Это человек, знакомый с программированием, но новый для языка, все, что им нужно, - это указатель на нужные классы. – arcy

2

Что именно вы используете? Лучший контейнер будет зависеть от того, будет ли ваше использование, включая вставки, удаление, чтение в порядке или нет и т. Д.

Если вас интересуют только Java-эквиваленты классов C++ STL, эквивалент Java std :: vector ArrayList (см. Equivalent of std::vector in Java?). Они представляют собой динамические массивы.

Если я не ошибаюсь, Java-эквивалент std :: list - LinkedList.

Этот ответ дает хороший обзор на тему: Linked List vs Vector

Если вы ищете список, который был вставлен и удален при сохранении упорядоченном, вы, вероятно, лучше всего вместе с TreeSet, как упомянутых в комментариях выше.

+0

Это не будет сортировать объекты «Кандидат» по значению имени, которое они содержат. – Bobulous

+0

Исправить, отредактировать. Однако вопрос неоднозначен, поскольку он обсуждает классы STL, которые также не сортируются. – shiri

1

Вы, наверное, лучше всего с помощью PriorityQueue с этим конструктором https://docs.oracle.com/javase/7/docs/api/java/util/PriorityQueue.html#PriorityQueue(int,%20java.util.Comparator)

Тогда вы можете просто создать его экземпляр с помощью как:

new PriorityQueue<Candidate>(10, new Comparator<Candidate>() { 
      @Override 
      public int compare(final Candidate o1, final Candidate o2) { 
       return Candidate.getName().compareTo(o2.getName()); 
      } 
     }); 

10 будет просто пример мощности здесь, вы можете выбрать любой подходит для вашего прецедента.

Очередь приоритетов автоматически закажет ваши объекты Candidate в соответствии с их именем на каждой вставке, так как вы указали Comparator, который делает это за вас.

+1

Из любопытства, почему вы рекомендуете 'PriorityQueue' над' TreeSet'? – Bobulous

+0

@Bobulous 'TreeSet', будучи' Set', был бы менее общим ответом. Хотя, говоря о «Кандидатах», я думаю, что найти не нужно дубликатов, но зачем вводить ограничение уникальности, когда вам этого не нужно, и это не в описании проблемы :)? –

+0

@ArminBraun Спасибо за ваш ответ, хотя я, наконец, решил использовать TreeSet в основном потому, что я больше привык к этому, спасибо! – magalenyo

0

Вы можете использовать TreeSet для вставки в контейнер, который поддерживается в отсортированном виде. Однако это набор, а не список, поэтому вы не можете получить доступ по индексу.

0

Простой подход:

// Объявите свой класс Candidate как:

class Candidate 
    { 
     int id; 
     String name; 

     Candidate(int id,String name) 
     { 
     this.id=id; 
      this.name=name; 
     } 

     public int getId() 
     { 
      return this.id; 
     } 

     public String getName() 
     { 
      return this.Name; 
     } 
    } 

class Main 
{ 
     public static void main(String args[]) 
     { 
      ArrayList<Candidate> al=new ArrayList<Candidate>(); 
      al.add(new Candidate(1,"ABC")); 
      al.add(new Candidate(2,"XYZ")); 
      al.add(new Candidate(3,"PQR")); 

      Collections.sort(al,new SortByName()); 

      System.out.println(al); 

     } 
    } 

// Объявляем компаратор для сортировки по имени

class SortByName implements Comparator<Candidate> 
    { 
     public int compare(Candidate c1,Candidate c2) 
     { 
      return c1.getName().compareTo(c2.getName()); 
     } 
    } 

// Как вы разместили в ваш вопрос, что вы новичок в java, и согласно вашему требованию вы хотите иметь контейнер для хранения объектов класса, а затем сортировать их по имени своего имени. Следовательно, я использовал ArrayList из класса Collections, который очень прост в использовании и изучен для начинающих, я бы подумал, что вы должны пройти через базовую концепцию класса arraylist, Comparator, Collections и т. Д.

+0

Почему я получил нижний предел здесь? –

+0

OP хочет сохранить отсортированную коллекцию по имени ученика в качестве варианта коллекции tiself. он не хочет сортировать его каждый раз перед выполнением любой операции над этой коллекцией. Однако, поскольку он упомянул, что хочет использовать какой-то аналогичный вектор/список C++ 11, это может привести к путанице. здесь +1 для того, чтобы быть gentelman. вы не заслуживаете этого нисходящего. – Aviv

0

Спасибо всем, кто ответил за все ответы, после исследования предложений, которые вы мне предоставили, я, наконец, решил использовать TreeSet только потому, что нашел, что это было самым полезным для меня в этом случае. Еще раз спасибо!

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