我是Java 8的新手。我只想按名字排序。但条件是:如果有重复的名字,那么应该根据年龄进行排序。
例如,我的输入是
tarun 28
arun 29
varun 12
arun 22
输出应该是
arun 22
arun 29
tarun 28
varun 12
但我得到的是
varun 12
arun 22
tarun 28
arun 29
意味着它只按年龄或名字排序。
这是实现的代码:
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;
}
}
测试类别:
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);
}
}
8条答案
按热度按时间agxfikkp1#
目前,您a)只通过一个属性进行比较,b)没有真正使用Java 8的新特性。
在Java 8中,你可以使用method references和链式比较器,如下所示:
这将比较两个
Person
示例,首先是它们的fname
,如果相等,则是它们的age
(对thenComparingInt
进行了轻微优化以避免装箱)。7nbnzgx92#
你需要先比较一下名字。如果名字是一样的,那么也只有这样,结果才取决于年龄的比较
如果你想从升序变成降序,只要改变符号就行了。例如
或者交换
姓名
年龄
jckbn6z73#
您的方法是正确的,但是您的
compare
方法是不完整的。由于
compare
被调用来决定每一对中的哪一个项目在另一个之前,它必须包括所有的比较逻辑,而不仅仅是平局打破逻辑。您的代码仅根据年龄进行排序,而完全忽略名称。逻辑应该是这样的:
t.getFname().compareTo(t1.getFname())
比较名称比较整数的正确方法是使用静态
Integer.compare
方法,即Integer.compare(t.getAge(), t1.getAge())
。mo49yndu4#
您的
Comparator
仅按年龄排序,而不是按姓名排序。你可以这样尝试:
您也可以考虑在
Person
类本身中实现Comparable<Person>
:2hh7jdfx5#
你可以使用Java 8中引入的
Comparator.comparing
方法,返回一个Comparator对象,该对象将使用指定的字段作为排序键。我们首先创建了两个lambda表达式,一个返回给定人的年龄,另一个返回该人的姓名。然后,我们在调用
sorted()
方法时组合了这两个lambda表达式,以比较这两个属性。comparing()
方法创建并返回一个Comparator,以根据年龄进行比较。在返回的Comparator上,我们调用thenComparing()
方法来创建一个复合comparator
,它根据年龄和姓名进行比较ih99xse16#
这是一个简单的一行比较,使用三元运算符对对象进行排序。不需要写那么多if/else块。
0s0u357o7#
//不使用比较器排序
import java.util.ArrayList; import java.util.List;
public class Uncategorized {
}
q8l4jmvw8#
您可以简单地使用带有getName和getAge方法的静态引用的stream sorted方法。