Java数组排序的姓氏然后年龄

时间:2018-04-08 23:07:42

标签: java arrays sorting arraylist collections

我使用排序编写了一个程序,首先按条目的姓氏对数组列表进行排序,然后按年龄排序,从而创建2个列表作为输出。问题是姓氏排序似乎运作良好,但年龄排序总是将名称与姓氏排序的顺序相同。 到目前为止,这是我的代码,我有2个类。

package myperson;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

public class Queue implements Comparable<Queue> {
public Person Data;
public int iter=0;
public Queue(String first, String last,int age)
{
Data = new Person(first, last, age);
}
@Override
public int compareTo(Queue other)
{
if(iter==0){
iter++;
return Data.Last.compareTo(other.Data.Last);
}
else
return Double.compare(Data.Age, other.Data.Age);
}
@Override
public String toString() {

return Data.First + " " + Data.Last;
}
public static void main(String[] args) throws java.io.IOException {
ArrayList list = new ArrayList();
String first;
String last;
int age = 0;
Scanner sc=new Scanner(System.in);

list.add(new Queue("John", "Huber", 22));
list.add(new Queue("Chelsea", "Davis", 32));
list.add(new Queue("Susan", "Taylor", 46));
list.add(new Queue("Scott", "Zedburg", 59));

System.out.println("Ordered by Last Name");
Collections.sort(list);
for (int i = 0; i < list.size(); i++)
{
System.out.println(list.get(i));
}
System.out.println("\nSort by Age");
Collections.sort(list);
for (int i = 0; i < list.size(); i++)
{
System.out.println(list.get(i));
}
}
}

人员类:

 package myperson;
    public class Person {
    public String First;
    public String Last;
    public double Age;
    public Person(String first, String last,double age)
    {
    First = first;
    Last = last;
    Age = age;
    }  
    }

输出:

运行:

  Ordered by Last Name

切尔西戴维斯

John Huber

苏珊泰勒

Scott Zedburg

  Sort by Age

切尔西戴维斯

John Huber

苏珊泰勒

Scott Zedburg

建立成功(总时间:0秒)

1 个答案:

答案 0 :(得分:1)

遗憾的是,您在此代码中遇到了很多问题。您正尝试在比较函数中使用变量来更改其行为。这打破了许多关于比较函数应如何工作的规则。阅读Comparable的文档,了解完整的规则和约定。

更好的方法是在调用sort中指定比较函数。您的最终排序代码应如下所示:

List<Person> people = new ArrayList<>();
...

people.sort(Comparator.comparing(Person::getName));
...
people.sort(Comparator.comparingInt(Person::getAge));