我使用排序编写了一个程序,首先按条目的姓氏对数组列表进行排序,然后按年龄排序,从而创建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秒)
答案 0 :(得分:1)
遗憾的是,您在此代码中遇到了很多问题。您正尝试在比较函数中使用变量来更改其行为。这打破了许多关于比较函数应如何工作的规则。阅读Comparable
的文档,了解完整的规则和约定。
更好的方法是在调用sort中指定比较函数。您的最终排序代码应如下所示:
List<Person> people = new ArrayList<>();
...
people.sort(Comparator.comparing(Person::getName));
...
people.sort(Comparator.comparingInt(Person::getAge));