我有对象数组 person (int age; String name;)
。
如何按名称和年龄的字母顺序对这个数组进行排序?
您会为此使用哪种算法?
原文由 Damir 发布,翻译遵循 CC BY-SA 4.0 许可协议
我有对象数组 person (int age; String name;)
。
如何按名称和年龄的字母顺序对这个数组进行排序?
您会为此使用哪种算法?
原文由 Damir 发布,翻译遵循 CC BY-SA 4.0 许可协议
对于那些能够使用 Java 8 流 API 的人来说,这里有一个更简洁的方法,这里有详细的记录: Lambdas and sorting
我一直在寻找 C# LINQ 的等价物:
.ThenBy(...)
我在比较器上找到了 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);
}
}
原文由 Luke Machowski 发布,翻译遵循 CC BY-SA 3.0 许可协议
8 回答6.5k 阅读
4 回答684 阅读✓ 已解决
2 回答3.4k 阅读
3 回答1.9k 阅读✓ 已解决
1 回答2.1k 阅读✓ 已解决
1 回答2.1k 阅读✓ 已解决
1 回答959 阅读✓ 已解决
您可以使用
Collections.sort
如下:List<Persons>
现在按名称排序,然后按年龄排序。String.compareTo
“按字典顺序比较两个字符串”-来自 文档。Collections.sort
是原生 Collections 库中的静态方法。它进行实际排序,您只需要提供一个 Comparator 来定义列表中的两个元素应如何进行比较:这是通过提供您自己的compare
方法的实现来实现的。