使用Java8流方法。。。
//Creates and sorts a stream (does not sort the original list)
persons.stream().sorted(Comparator.comparing(Person::getName).thenComparing(Person::getAge));
Java8 Lambda方法...
//Sorts the original list Lambda style
persons.sort((p1, p2) -> {
if (p1.getName().compareTo(p2.getName()) == 0) {
return p1.getAge().compareTo(p2.getAge());
} else {
return p1.getName().compareTo(p2.getName());
}
});
最后一点
//This is similar SYNTAX to the Streams above, but it sorts the original list!!
persons.sort(Comparator.comparing(Person::getName).thenComparing(Person::getAge));
对于那些能够使用Java8流式API的人来说,这里有一种更简洁的方法:Lambdas和排序
我在寻找C#LINQ的等价物:
.ThenBy(...)
我在Comparator上找到了Java 8中的机制:
.thenComparing(...)
这是演示算法的片段。
Comparator<Person> comparator = Comparator.comparing(person -> person.name);
comparator = comparator.thenComparing(Comparator.comparing(person -> person.age));
查看上面的链接,了解一种更简洁的方式,以及关于Java的类型推断如何使它比LINQ更难定义的解释。
以下是完整的单元测试供参考:
@Test
public void testChainedSorting()
{
// Create the collection of people:
ArrayList<Person> people = new ArrayList<>();
people.add(new Person("Dan", 4));
people.add(new Person("Andi", 2));
people.add(new Person("Bob", 42));
people.add(new Person("Debby", 3));
people.add(new Person("Bob", 72));
people.add(new Person("Barry", 20));
people.add(new Person("Cathy", 40));
people.add(new Person("Bob", 40));
people.add(new Person("Barry", 50));
// Define chained comparators:
// Great article explaining this and how to make it even neater:
// http://blog.jooq.org/2014/01/31/java-8-friday-goodies-lambdas-and-sorting/
Comparator<Person> comparator = Comparator.comparing(person -> person.name);
comparator = comparator.thenComparing(Comparator.comparing(person -> person.age));
// Sort the stream:
Stream<Person> personStream = people.stream().sorted(comparator);
// Make sure that the output is as expected:
List<Person> sortedPeople = personStream.collect(Collectors.toList());
Assert.assertEquals("Andi", sortedPeople.get(0).name); Assert.assertEquals(2, sortedPeople.get(0).age);
Assert.assertEquals("Barry", sortedPeople.get(1).name); Assert.assertEquals(20, sortedPeople.get(1).age);
Assert.assertEquals("Barry", sortedPeople.get(2).name); Assert.assertEquals(50, sortedPeople.get(2).age);
Assert.assertEquals("Bob", sortedPeople.get(3).name); Assert.assertEquals(40, sortedPeople.get(3).age);
Assert.assertEquals("Bob", sortedPeople.get(4).name); Assert.assertEquals(42, sortedPeople.get(4).age);
Assert.assertEquals("Bob", sortedPeople.get(5).name); Assert.assertEquals(72, sortedPeople.get(5).age);
Assert.assertEquals("Cathy", sortedPeople.get(6).name); Assert.assertEquals(40, sortedPeople.get(6).age);
Assert.assertEquals("Dan", sortedPeople.get(7).name); Assert.assertEquals(4, sortedPeople.get(7).age);
Assert.assertEquals("Debby", sortedPeople.get(8).name); Assert.assertEquals(3, sortedPeople.get(8).age);
// Andi : 2
// Barry : 20
// Barry : 50
// Bob : 40
// Bob : 42
// Bob : 72
// Cathy : 40
// Dan : 4
// Debby : 3
}
/**
* A person in our system.
*/
public static class Person
{
/**
* Creates a new person.
* @param name The name of the person.
* @param age The age of the person.
*/
public Person(String name, int age)
{
this.age = age;
this.name = name;
}
/**
* The name of the person.
*/
public String name;
/**
* The age of the person.
*/
public int age;
@Override
public String toString()
{
if (name == null) return super.toString();
else return String.format("%s : %d", this.name, this.age);
}
}
您可以使用Collections.sort
如下:
private static void order(List<Person> persons) {
Collections.sort(persons, new Comparator() {
public int compare(Object o1, Object o2) {
String x1 = ((Person) o1).getName();
String x2 = ((Person) o2).getName();
int sComp = x1.compareTo(x2);
if (sComp != 0) {
return sComp;
}
Integer x1 = ((Person) o1).getAge();
Integer x2 = ((Person) o2).getAge();
return x1.compareTo(x2);
}});
}
列表
字符串。compareTo
“按字典顺序比较两个字符串”——来自文档。
收藏。sort
是本机集合库中的一种静态方法。它进行实际排序,您只需要提供一个比较器,它定义了如何比较列表中的两个元素:这是通过提供自己的compare
方法实现的。
问题内容: 我有很多对象。 如何按名称和年龄先后按字母顺序对该数组排序? 您将使用哪种算法? 问题答案: 你可以使用以下方法: 现在按名称排序,然后按年龄排序。 “从字典上比较两个字符串”-来自docs。 是本机库中的静态方法。它会进行实际的排序,你只需要提供一个即可定义应该如何比较列表中的两个元素:这是通过提供你自己的方法实现来实现的。
我有一个我正在制作的纸牌游戏的高分数组列表。对于这个arraylist可以存储的分数数量需要有一个有限的限制,系统的用户可以定义这个限制(假设现在是10个)。arraylist中的对象中的字段是玩家的名称(字符串)、他们的分数(int)和玩家的(几乎)唯一的ID(Long,System.CurrentTimeMillis())。arraylist应该按分数排序,其中分数最低的是最好的。但是,如果a
我有一个ArrayList,其中包含下一个数据:coordX、coordY、长度、位置(位置可以有3种类型:垂直、水平或1x1)。使用插入方法,我按长度对其进行降序排序。如果长度等于具有水平位置的长度值,我如何给予优先级。对于给定的输入: 输出应为: 这就是我目前的情况: 这部分代码只负责按长度排序。
本文向大家介绍如何在MySQL中按分组字段排序?,包括了如何在MySQL中按分组字段排序?的使用技巧和注意事项,需要的朋友参考一下 要对分组字段进行ORDER BY,请将ORDER BY CASE与一起使用。CASE评估不同的条件,而ORDER BY则按升序或降序对值进行排序。MySQL用于查找匹配项。 让我们首先创建一个表- 使用插入命令在表中插入一些记录- 使用select语句显示表中的所有记
问题内容: 我有一个从排序的csv创建的以下列表 我实际上想按两个条件对列表进行排序:首先按字段1中的值,然后按字段2中的值。我该怎么做? 问题答案: 像这样:
问题内容: 有一个字段’noticeBy’枚举(’email’,’mobile’,’all’,’auto’,’nothing’)NOT NULL默认’auto’。众所周知,按ENUM字段排序相对于其索引执行。但是,如何通过其值进行排序? 问题答案: 如“ 排序”中所述: 值根据其索引号排序,索引号取决于列规范中列出的枚举成员的顺序。例如,在for 之前排序。空字符串排在非空字符串之前,值排在所有其