如何在Java中按两个字段排序?

如何在Java中按两个字段排序?

我有一系列的对象person (int age; String name;).

我如何按名称和年龄按字母顺序对这个数组进行排序?

你会用哪种算法来解决这个问题?


慕婉清6462132
浏览 389回答 3
3回答

智慧大石

对于那些能够使用Java 8流API的人,有一种更整洁的方法在这里得到了详细的记录:羔羊和分类我在寻找C#LINQ的等价物:.ThenBy(...)我在比较器上找到了Java 8中的机制:.thenComparing(...)下面是演示算法的片段。&nbsp;&nbsp;&nbsp;&nbsp;Comparator<Person>&nbsp;comparator&nbsp;=&nbsp;Comparator.comparing(person&nbsp;->&nbsp;person.name); &nbsp;&nbsp;&nbsp;&nbsp;comparator&nbsp;=&nbsp;comparator.thenComparing(Comparator.comparing(person&nbsp;->&nbsp;person.age));请查看上面的链接,以获得更整洁的方式,并解释Java的类型推断如何使其定义比LINQ更笨重。以下是完整的单元测试,以供参考:@Testpublic&nbsp;void&nbsp;testChainedSorting(){ &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Create&nbsp;the&nbsp;collection&nbsp;of&nbsp;people: &nbsp;&nbsp;&nbsp;&nbsp;ArrayList<Person>&nbsp;people&nbsp;=&nbsp;new&nbsp;ArrayList<>(); &nbsp;&nbsp;&nbsp;&nbsp;people.add(new&nbsp;Person("Dan",&nbsp;4)); &nbsp;&nbsp;&nbsp;&nbsp;people.add(new&nbsp;Person("Andi",&nbsp;2)); &nbsp;&nbsp;&nbsp;&nbsp;people.add(new&nbsp;Person("Bob",&nbsp;42)); &nbsp;&nbsp;&nbsp;&nbsp;people.add(new&nbsp;Person("Debby",&nbsp;3)); &nbsp;&nbsp;&nbsp;&nbsp;people.add(new&nbsp;Person("Bob",&nbsp;72)); &nbsp;&nbsp;&nbsp;&nbsp;people.add(new&nbsp;Person("Barry",&nbsp;20)); &nbsp;&nbsp;&nbsp;&nbsp;people.add(new&nbsp;Person("Cathy",&nbsp;40)); &nbsp;&nbsp;&nbsp;&nbsp;people.add(new&nbsp;Person("Bob",&nbsp;40)); &nbsp;&nbsp;&nbsp;&nbsp;people.add(new&nbsp;Person("Barry",&nbsp;50)); &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Define&nbsp;chained&nbsp;comparators: &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Great&nbsp;article&nbsp;explaining&nbsp;this&nbsp;and&nbsp;how&nbsp;to&nbsp;make&nbsp;it&nbsp;even&nbsp;neater: &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;http://blog.jooq.org/2014/01/31/java-8-friday-goodies-lambdas-and-sorting/ &nbsp;&nbsp;&nbsp;&nbsp;Comparator<Person>&nbsp;comparator&nbsp;=&nbsp;Comparator.comparing(person&nbsp;->&nbsp;person.name); &nbsp;&nbsp;&nbsp;&nbsp;comparator&nbsp;=&nbsp;comparator.thenComparing(Comparator.comparing(person&nbsp;->&nbsp;person.age)); &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Sort&nbsp;the&nbsp;stream: &nbsp;&nbsp;&nbsp;&nbsp;Stream<Person>&nbsp;personStream&nbsp;=&nbsp;people.stream().sorted(comparator); &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Make&nbsp;sure&nbsp;that&nbsp;the&nbsp;output&nbsp;is&nbsp;as&nbsp;expected: &nbsp;&nbsp;&nbsp;&nbsp;List<Person>&nbsp;sortedPeople&nbsp;=&nbsp;personStream.collect(Collectors.toList()); &nbsp;&nbsp;&nbsp;&nbsp;Assert.assertEquals("Andi",&nbsp;&nbsp;sortedPeople.get(0).name);&nbsp;Assert.assertEquals(2,&nbsp;&nbsp;sortedPeople.get(0).age); &nbsp;&nbsp;&nbsp;&nbsp;Assert.assertEquals("Barry",&nbsp;sortedPeople.get(1).name);&nbsp;Assert.assertEquals(20,&nbsp;sortedPeople.get(1).age); &nbsp;&nbsp;&nbsp;&nbsp;Assert.assertEquals("Barry",&nbsp;sortedPeople.get(2).name);&nbsp;Assert.assertEquals(50,&nbsp;sortedPeople.get(2).age); &nbsp;&nbsp;&nbsp;&nbsp;Assert.assertEquals("Bob",&nbsp;&nbsp;&nbsp;sortedPeople.get(3).name);&nbsp;Assert.assertEquals(40,&nbsp;sortedPeople.get(3).age); &nbsp;&nbsp;&nbsp;&nbsp;Assert.assertEquals("Bob",&nbsp;&nbsp;&nbsp;sortedPeople.get(4).name);&nbsp;Assert.assertEquals(42,&nbsp;sortedPeople.get(4).age); &nbsp;&nbsp;&nbsp;&nbsp;Assert.assertEquals("Bob",&nbsp;&nbsp;&nbsp;sortedPeople.get(5).name);&nbsp;Assert.assertEquals(72,&nbsp;sortedPeople.get(5).age); &nbsp;&nbsp;&nbsp;&nbsp;Assert.assertEquals("Cathy",&nbsp;sortedPeople.get(6).name);&nbsp;Assert.assertEquals(40,&nbsp;sortedPeople.get(6).age); &nbsp;&nbsp;&nbsp;&nbsp;Assert.assertEquals("Dan",&nbsp;&nbsp;&nbsp;sortedPeople.get(7).name);&nbsp;Assert.assertEquals(4,&nbsp;&nbsp;sortedPeople.get(7).age); &nbsp;&nbsp;&nbsp;&nbsp;Assert.assertEquals("Debby",&nbsp;sortedPeople.get(8).name);&nbsp;Assert.assertEquals(3,&nbsp;&nbsp;sortedPeople.get(8).age); &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Andi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;2 &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Barry&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;20 &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Barry&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;50 &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Bob&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;40 &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Bob&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;42 &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Bob&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;72 &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Cathy&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;40 &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Dan&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;4 &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Debby&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;3}/** &nbsp;*&nbsp;A&nbsp;person&nbsp;in&nbsp;our&nbsp;system. &nbsp;*/public&nbsp;static&nbsp;class&nbsp;Person{ &nbsp;&nbsp;&nbsp;&nbsp;/** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Creates&nbsp;a&nbsp;new&nbsp;person. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;name&nbsp;The&nbsp;name&nbsp;of&nbsp;the&nbsp;person. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;age&nbsp;The&nbsp;age&nbsp;of&nbsp;the&nbsp;person. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Person(String&nbsp;name,&nbsp;int&nbsp;age) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.age&nbsp;=&nbsp;age; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.name&nbsp;=&nbsp;name; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;/** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;The&nbsp;name&nbsp;of&nbsp;the&nbsp;person. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;name; &nbsp;&nbsp;&nbsp;&nbsp;/** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;The&nbsp;age&nbsp;of&nbsp;the&nbsp;person. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;age; &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;toString() &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(name&nbsp;==&nbsp;null)&nbsp;return&nbsp;super.toString(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;return&nbsp;String.format("%s&nbsp;:&nbsp;%d",&nbsp;this.name,&nbsp;this.age); &nbsp;&nbsp;&nbsp;&nbsp;}}

繁星coding

使用Java 8流方法.。//Creates&nbsp;and&nbsp;sorts&nbsp;a&nbsp;stream&nbsp;(does&nbsp;not&nbsp;sort&nbsp;the&nbsp;original&nbsp;list)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; persons.stream().sorted(Comparator.comparing(Person::getName).thenComparing(Person::getAge));Java 8 Lambda方法.。//Sorts&nbsp;the&nbsp;original&nbsp;list&nbsp;Lambda&nbsp;stylepersons.sort((p1,&nbsp;p2)&nbsp;->&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(p1.getName().compareTo(p2.getName())&nbsp;==&nbsp;0)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;p1.getAge().compareTo(p2.getAge()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;p1.getName().compareTo(p2.getName()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;});最后.。//This&nbsp;is&nbsp;similar&nbsp;SYNTAX&nbsp;to&nbsp;the&nbsp;Streams&nbsp;above,&nbsp;but&nbsp;it&nbsp;sorts&nbsp;the&nbsp;original&nbsp;list!! persons.sort(Comparator.comparing(Person::getName).thenComparing(Person::getAge));
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java