Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java根据字符串对自定义对象列表进行排序_Java_List_Sorting - Fatal编程技术网

Java根据字符串对自定义对象列表进行排序

Java根据字符串对自定义对象列表进行排序,java,list,sorting,Java,List,Sorting,职业有价值: 工程师 医生 老师 学生 我有一个人的名单,想按职业分类。 工程师先来,然后是医生,然后是老师,然后是学生 是否可以使用可比较的界面对其进行排序。实现comparable 是的,你可以实施。创建一个方法compareTo(Person obj),然后编写自定义逻辑。你可以按字母顺序或任何你想要的其他算法进行比较-例如,医生之前的工程师因为他赚更多的钱:)对于字母顺序比较,你可以这样做: class Person { private String name; privat

职业有价值:

  • 工程师
  • 医生
  • 老师
  • 学生
我有一个人的名单,想按职业分类。 工程师先来,然后是医生,然后是老师,然后是学生

是否可以使用可比较的界面对其进行排序。

实现
comparable
是的,你可以实施。创建一个方法compareTo(Person obj),然后编写自定义逻辑。你可以按字母顺序或任何你想要的其他算法进行比较-例如,医生之前的工程师因为他赚更多的钱:)对于字母顺序比较,你可以这样做:

class Person 
 {
 private String name;
 private String profession;
}
class-Person实现可比性{
@凌驾
公共内部比较(o人){
将此.profession.compareTo返回(o.getProfession());
}
私有字符串名称;
私人弦乐专业;
}

之后,只需使用集合。排序将枚举添加到变量中:

class Person implements Comparable<Person> {

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

  }
  private String name;
  private String profession;
}
之后,可以为Person类添加功能,从而为您提供专业价值:

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

之后,您只需实现将对所有人进行排序的逻辑。为此,您可以帮助自己回答以下问题:

您可以使用
集合对自定义对象进行排序。排序方法如下:

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

    });
要按
相反的顺序进行
排序
,只需将
return
语句行如下所示

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

    });
这将直接对您的
列表进行排序。

我的建议-

1.创建一个新类
Profession
-

p2.getProfession().compareToIgnoreCase(p1.getProfession());
2.现在为维护订单的每个
Profession
对象/实例提供Id。例如—

class Profession{

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

}  

3.现在使用
可比较的
接口对
职业
进行排序,以获得
id

在Person类中为职业添加getter和setter,只需使用下面的代码即可

   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");
班级人员{
私有字符串名称;
私人弦乐专业;
公共字符串getProfession(){
回归职业;
}  
公共职业(字符串职业){
这个职业=职业;
}
}
List personList=新建ArrayList();
人员p1=新人员();
p1.专业人员(“工程师”);
personList.add(p1);
人员p2=新人员();
p2.职业(“医生”);
personList.add(p2);
人员p3=新人员();
p3.教师专业(“教师”);
个人列表。添加(p3);
人员p4=新人员();
p4.职业(“学生”);
personList.add(p4);
Collections.sort(personList,new Comparator(){
@凌驾
公共整数比较(对象obj1,对象obj2){
人员p1=(人员)obj1;
人员p2=(人员)obj2;
返回p1.getProfession().compareToIgnoreCase(p2.getProfession());
}  
});
Enum 如果将
profession
字段替换为
enum
,则可以轻松完成此操作:

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());  
}  
});
如果您不熟悉Java中的枚举功能,请参阅。

两种方法:

  • 实现
    可比
    界面
  • 创建一个
    比较器
  • 使用第一种方法,您只能通过一种方法对集合进行排序
    compareTo
    ,您将定义

    您的
    Person.java

    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;
        }
    }
    
    使用第二种方法,您可以通过一个或多个
    比较器进行排序,从而能够使用不同的条件比较相同的集合

    两个
    比较器的示例

    Collections.sort(yourCollection);
    

    写得很好,你可以举一些例子

    你的排序逻辑是什么。我认为工程师>医生>教师>学生不可能使用
    字符串
    也许如果专业是一个枚举…有一个默认的字符串函数,它根据字母表排序[你可以参考我这个问题的答案,有点像这样][1][1]:我投票支持
    enum
    ,因为它可以很容易地直接比较,而不需要任何类型的权重值映射。不需要这种映射,您可以直接比较enum实例。(例如,
    EnumProfession.DOCTOR.compareTo(EnumProfession.TEACHER)
    )顺序将是定义值的顺序。我尝试过:如果你将教师和学生进行比较,你会得到:-1,如果你进行比较,你也会得到:-1,所以如果你想尝试按照我在步骤2中提出的方法对其进行排序,你就不能这样做。如果我尝试我的解决方案:我得到以下值:System.out.println(professionValue(“医生”));输出:1 System.out.println(专业值(“教师”));输出:2 System.out.println(专业值(“学生”));输出:3我喜欢你的帖子,因为没有其他人提出枚举,而是一些映射或字母排序(当添加
    engineer
    时,这些映射或字母排序被破坏)。但它真的不需要如此丑陋的映射。请看这里:如果您通过映射将教师和学生进行比较,您也会得到-1。所以一切都很好。当他复制代码时,他可能忘了把医生改成2,把老师改成3,把学生改成4……谢谢。这是一个拼写错误,我刚刚修复了它。这样,工程师将在需要站在后面的时候站在医生后面。我编辑了您的好示例代码,以使用JDK类中使用的
    displayName
    命名样式,例如
    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());