【问题标题】:Java to sort list of custom object on the basis of stringJava根据字符串对自定义对象列表进行排序
【发布时间】:2015-05-07 12:15:42
【问题描述】:
class Person 
 {
 private String name;
 private String profession;
}

职业有价值观:

  • 工程师
  • 医生
  • 老师
  • 学生

我有人员列表,想根据职业对其进行排序。 首先是工程师,然后是医生,然后是老师,然后是学生。

是否可以用类似的界面对其进行排序。

【问题讨论】:

  • 你的排序逻辑是什么。我认为 Engineer>Doctor>Teacher>Student 不可能String
  • 也许职业是一个枚举...
  • 有一个默认的按字母排序的字符串函数
  • [你可以参考我这个问题的答案,有点像这样][1] [1]:stackoverflow.com/questions/29777696/…
  • 我投票给enum,因为它可以很容易地直接比较,无需任何类型的权重值映射。

标签: java list sorting


【解决方案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());
        }

    });

reverse order 中的Sort 只需像这样写你的return 语句行,

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

这将直接使您的list 排序。

【讨论】:

  • 这样,工程师需要站在医生后面的时候会站在后面。
【解决方案2】:

将枚举添加到您的变量中:

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

【讨论】:

  • 不需要这样的映射,可以直接比较枚举实例。 (例如EnumProfession.DOCTOR.compareTo(EnumProfession.TEACHER))顺序将是定义值的顺序。
  • 我试过了:pastebin.com/QnqXffmJ 如果你比较老师和学生,你会得到:-1,如果你比较,你也会得到:-1 所以如果你想像我在第 2 步中建议的那样对它进行排序,你做不到。但你可以让它有点不同。
  • 如果我尝试我的解决方案:pastebin.com/ufbWZkVw 我得到这个值:System.out.println(professionValue("Doctor"));输出:1 System.out.println(professionValue("Teacher"));输出:2 System.out.println(professionValue("student"));输出:3
  • 我喜欢你的帖子,因为没有其他人提出枚举,而是一些映射或字母排序(在添加 engineer 时被破坏了)。但它真的不需要这么难看的映射。见这里:docs.oracle.com/javase/8/docs/api/java/lang/…
  • 因此,如果您通过映射比较教师和学生,您也会得到 -1。所以一切都很好。
【解决方案3】:

实现Comparable

是的,您可以实现Comparable。创建一个方法 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

【讨论】:

    【解决方案4】:

    枚举

    如果将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 displayName;
        
        Profession(String dn) {
            this.displayName = dn;
        }
    
        @Override
        public String toString() {
            return this.displayName;
        }
    }
    

    如果您不熟悉 Java 中的枚举工具,请参阅 Oracle tutorial

    【讨论】:

    • 我编辑了你很好的示例代码以使用 JDK 类中使用的 displayName 命名风格,例如 DayOfWeek
    【解决方案5】:

    在 Person 类中为职业添加 getter 和 setter 并简单地使用下面的代码

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

    【讨论】:

      【解决方案6】:

      两种方式:

      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写得真好,你可以举一些例子

      【讨论】:

        【解决方案7】:

        我的建议——

        1.创建一个新类Profession -

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

        2. 现在为每个维护顺序的Profession 对象/实例提供 ID。例如 -

           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. 现在使用compareable 接口将Profession 排序为id

        【讨论】:

        • 他可能在复制代码时忘记将Doctor改为2,Teacher改为3,Student改为4...
        • 谢谢。这是一个错字,我刚刚修正了。
        猜你喜欢
        • 1970-01-01
        • 2012-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-18
        • 2016-11-03
        • 1970-01-01
        • 2019-08-18
        相关资源
        最近更新 更多