paw*_*rma 9 java sorting collections
我是Java 8的新手.我只想按名称排序.但条件是:如果有重复的名称,则应根据年龄进行排序.
例如,我的输入是
tarun 28
arun 29
varun 12
arun 22
Run Code Online (Sandbox Code Playgroud)
输出应该是
arun 22
arun 29
tarun 28
varun 12
Run Code Online (Sandbox Code Playgroud)
但我得到类似的东西
varun 12
arun 22
tarun 28
arun 29
Run Code Online (Sandbox Code Playgroud)
意味着它只按年龄或名字排序.
这是实现的代码:
POJO课程:
class Person {
String fname;
int age;
public Person() {
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getFname() {
return fname;
}
public void setFname(String fname) {
this.fname = fname;
}
public Person(String fname, int age) {
this.fname = fname;
this.age = age;
}
@Override
public String toString() {
return fname + age;
}
}
Run Code Online (Sandbox Code Playgroud)
测试类:
public class Test {
public static void main(String[] args) {
List<Person> persons = new ArrayList<>();
persons.add(new Person("tarun", 28));
persons.add(new Person("arun", 29));
persons.add(new Person("varun", 12));
persons.add(new Person("arun", 22));
Collections.sort(persons, new Comparator<Person>() {
@Override
public int compare(Person t, Person t1) {
return t.getAge() - t1.getAge();
}
});
System.out.println(persons);
}
}
Run Code Online (Sandbox Code Playgroud)
Mar*_*vin 12
目前你只是a)只用一个属性进行比较而b)没有真正使用Java 8的新功能.
使用Java 8,您可以使用方法引用和链式比较器,如下所示:
Collections.sort(persons, Comparator.comparing(Person::getFname)
.thenComparingInt(Person::getAge));
Run Code Online (Sandbox Code Playgroud)
这将比较两个Person实例首先由它们fname和 - 如果相等 - 由它们age(稍微优化thenComparingInt以避免装箱).
您需要先比较名称。如果名称相同,则且仅此结果取决于比较年龄
public static void main(String[] args) {
List<Person> persons = new ArrayList<>();
persons.add(new Person("tarun", 28));
persons.add(new Person("arun", 29));
persons.add(new Person("varun", 12));
persons.add(new Person("arun", 22));
Collections.sort(persons, new Comparator<Person>() {
public int compare(Person t, Person t1) {
int comp = t.getFname().compareTo(t1.getFname());
if (comp != 0) { // names are different
return comp;
}
return t.getAge() - t1.getAge();
}
});
System.out.println(persons);
}}
Run Code Online (Sandbox Code Playgroud)
如果要从升序变为降序,只需更改符号即可。例如
return -comp;
Run Code Online (Sandbox Code Playgroud)
或者换人
姓名
int comp = t1.getFname().compareTo(t.getFname());
Run Code Online (Sandbox Code Playgroud)
年龄
return t1.getAge() - t.getAge();
Run Code Online (Sandbox Code Playgroud)