2015-05-07 2 views
0
class Person 
{ 
private String name; 
private String profession; 
} 

профессии имеет значения:Java для сортировки списка пользовательских объектов на основе строки

  • инженер
  • Доктор
  • Преподаватель
  • студент

У меня есть список желающих и хочу сортировать его на основе Profession. Инженер приходит сначала, затем Доктор, а затем Учитель, а затем ученик.

Можно ли отсортировать его с помощью сопоставимого интерфейса.

+0

Какова ваша логика сортировки. Я думаю, что Инженер> Доктор> Учитель> Студент не может использоваться для 'String' – Razib

+1

, может быть, если профессия была enum ... – Blackbelt

+0

есть функция строки по умолчанию, которая сортируется в соответствии с алфавитами –

ответ

1

Да, вы можете реализовать сопоставимые. Создайте метод compareTo (Person obj), а затем напишите свою собственную логику. Вы можете сравнить по алфавиту или любой другой алгоритм вы хотите - например, инженер перед врачом, потому что он делает больше денег :) Для алфавитного сравнения вы можете сделать это так:

class Person implements Comparable<Person> { 

@Override 
public int compareTo(Person o) { 
    return this.profession.compareTo(o.getProfession()); 

    } 
    private String name; 
    private String profession; 
} 

После того, что вы просто использовать Collections.sort

1

Добавить перечисление ваших переменных:

class Person { 
    private String name; 
    private String profession; 
    private enum enumProffesion 
    { 
     Doctor, Teacher, student; 
    } 
} 

После этого можно добавить функцию в класс Person, который даст вам значение профессии:

public int professionValue() 
{ 
    enumProffesion enumValue= enumProffesion.valueOf(proffesion); 
    switch (enumValue) { 
    case Doctor: return 1; break; 
    case Teacher: return 2; break; 
    case student: return 3; break; 
    default: return null; 
    } 
} 

После этого вы просто реализуете логику, которая сортирует всех Лиц. Для этого вы можете помочь себя с этим ответом: sorting integers in order lowest to highest java

+0

Нет необходимости в таком сопоставлении, вы можете напрямую сравнивать экземпляры enum. (например, 'EnumProfession.DOCTOR.compareTo (EnumProfession.TEACHER)') Порядок будет таким, чтобы были определены значения. –

+0

Я попробовал: http://pastebin.com/QnqXffmJ И если вы сравните Учителя с Студентом, вы получите: -1 , и если вы сравните, вы также получите: -1 Итак, если вы попытаетесь отсортировать его, как я предложил на шаге 2 вы не могли этого сделать. Но вы могли бы немного разобраться. – Jure

+0

Если я попробую свое решение: http: // pastebin.com/ufbWZkVw Получаю следующие значения: System.out.println (professionValue («Доктор»)); output: 1 System.out.println (professionValue («Учитель»)); output: 2 System.out.println (professionValue ("student")); output: 3 – Jure

1

Вы можете отсортировать пользовательский объект, используя Collection.sort метод, как это,

Collections.sort(list, new Comparator(){ 

     public int compare(Object o1, Object o2) { 
      Person p1 = (Person) o1; 
      Person p2 = (Person) o2; 
      return p1.getProfession().compareToIgnoreCase(p2.getProfession()); 
     } 

    }); 

Чтобы Sort в reverse order просто сделать return заявление линии, как это,

p2.getProfession().compareToIgnoreCase(p1.getProfession()); 

Это может привести к неправильной сортировке вашего list.

+0

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

0

Мое предложение -

1. создать новый класс Profession -

class Profession{ 

    public Profession(Integer id, String prefessionName){ 
     this.id=id; 
     this.prefessionName=prefessionName; 
    } 
    Integer id; 
    String professionName; 

} 

2. Теперь дайте Id каждому Profession объекта/например, поддержание порядка. Например -

Profession engineer = new Profession(1, "Engineer"); //since Engineer is in first place 
    Profession doctor = new Profession(2, "Doctor"); //since Doctor is in second place 
    Profession teacher = new Profession(3, "Teacher"); 
    Profession student = new Profession(4, "Student"); 

3. Теперь отсортировать Profession для id используя compareable интерфейс.

+1

Почему у всех профессий одинаковый идентификатор? –

+0

Он, вероятно, забыл сменить доктора на 2, учитель на 3 и ученика на 4, когда он копировал код ... – Jure

+0

Спасибо. Это опечатки, которые я только что зафиксировал. – Razib

0

Добавить геттер и сеттер для профессии в классе Person и просто использовать ниже код

class Person { 
    private String name; 
    private String profession; 
    public String getProfession() { 
     return profession; 
    } 
    public void setProfession(String profession) { 
     this.profession = profession; 
    } 
} 


List<Person> personList = new ArrayList<Person>(); 

Person p1 = new Person(); 
p1.setProfession("Engineer"); 
personList.add(p1); 

Person p2 = new Person(); 
p2.setProfession("Doctor"); 
personList.add(p2); 

Person p3 = new Person(); 
p3.setProfession("Teacher"); 
personList.add(p3); 

Person p4 = new Person(); 
p4.setProfession("student"); 
personList.add(p4); 


Collections.sort(personList, new Comparator() { 
@Override 
public int compare(Object obj1, Object obj2) { 
Person p1 = (Person)obj1; 
Person p2 = (Person)obj2; 
return p1.getProfession().compareToIgnoreCase(p2.getProfession()); 
} 
}); 
0

Вы можете сделать это легко, если заменить profession поле на enum:

class Person implements Comparable<Person> { 
    private String name; 
    private Profession profession; 

    // by this we'll define natural ordering based on ordering 
    // in which `Profession` enum values are declared 
    @Override 
    public int compareTo(Person p) { 
     return this.profession.compareTo(p.profession); 
    } 
} 

И вот Profession перечисление:

public enum Profession { 
    ENGINEER("engineer"), DOCTOR("Doctor"), TEACHER("Teacher"), STUDENT("student"); 

    private String text; 

    Profession(String t) { 
     this.text = t; 
    } 

    @Override 
    public String toString() { 
     return this.text; 
    } 
} 
0

2 w AYS:

  1. Реализовать интерфейс Comparable
  2. Создать Comparator

С первым способом вы можете сортировать коллекцию только один метод compareTo вы определите

Ваш Person.java

class Person implements Comparable<Person> { 
    private String name; 
    private String profession; 

    @Override 
    public int compareTo(Person o) { 
     return this.profession.compareTo(o.getProfession()); 
    } 

    public String getName() { 
     return name; 
    } 

    public String getProfession() { 
     return profession; 
    } 
} 

Тогда вам необходимо позвонить:

Collections.sort(yourCollection); 

Со вторым способом можно сортировать по одному или нескольким Comparator, давая вам возможность сравнить тот же набор с различными критериями.

Пример двух Comparator

public class PersonSortByNameComparator implements Comparator<Person>{ 

    @Override 
    public int compare(Person p1, Person p2) { 
        return p1.getName().compareTo(p2.getName()); 
    } 

} 

public class PersonSortByAlphabeticalProfessionComparator implements Comparator<Person>{ 

    @Override 
    public int compare(Person p1, Person p2) { 
        return p1.getProfession().compareTo(p2.getProfession()); 
    } 

} 

Или это один вам нужно:

public class PersonSortByProfessionComparator implements Comparator<Person> { 

    @Override 
    public int compare(Person p1, Person p2) { 
        if(p1.getProfession().equalsIgnoreCase(p2.getProfession()) 
      return 0; 
     if(p1.getProfession().equalsIgnoreCase("student") 
      return -1; 
     if(p1.getProfession().equalsIgnoreCase("engineer") 
      return 1; 
     if(p1.getProfession().equalsIgnoreCase("doctor") 
      return 1; 
     else 
      return -1; 
    } 
} 

А потом позвонить по одному из них:

Collections.sort(yourCollection, new PersonSortByNameComparator()); 

This blog article действительно хорошо написана и вы можете некоторые примеры

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