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