Java 如何根据人员的ID、姓名或出生日期订购包含人员的树状图或阵列列表?
我几乎什么都试过了,但我似乎无法让我的清单自行排序。 下面是一些代码:Java 如何根据人员的ID、姓名或出生日期订购包含人员的树状图或阵列列表?,java,collections,list,treemap,Java,Collections,List,Treemap,我几乎什么都试过了,但我似乎无法让我的清单自行排序。 下面是一些代码: private List<Person> names = new ArrayList<Person>(); private Map<Integer, Person> peopleMap = new TreeMap <Integer, Person>(); for(int i = 0; i<20; i++) { Person personO
private List<Person> names = new ArrayList<Person>();
private Map<Integer, Person> peopleMap = new TreeMap <Integer, Person>();
for(int i = 0; i<20; i++)
{
Person personOne = new Person();
peopleMap.put(personOne.id,personOne);
names.add(personOne);
}
Collections.sort(names);
run();
}
My Person class:
public class Person implements Comparable {
public String name;
public int id;
public Date birthdate;
static int idRecord = 0;
我应该补充一点,我不能在person类中调用我的toString方法。因为它是印刷品Person@a62fc3.
public void sortByID()
{
char tab = '\t';
for (int i = 1; i<20; i++)
System.out.println((peopleMap.get(i)).toString());
//System.out.println("ID Number: "+(peopleMap.get(i).id)+tab+" Name: "+tab+peopleMap.get(i).name+tab+" Birthdate: "+peopleMap.get(i).birthdate);
run();
}
注释后的代码可以工作,但调用toString的代码不会打印它应该打印的内容
与my Person类中的方法进行比较:
public int compareTo(Object obj) {
Person o = (Person) obj;
if (this.id == o.id) { return 0; }
if (this.id > o.id) { return 1; }
if (this.id < o.id) { return -1; }
return 0;
如果需要,我可以提供更多的代码
按名称比较方法及其输出。我应该创建一个arrayList来存储我的值,然后在其中进行排序吗
public void sortByName()
{
// char tab = '\t';
for(int j = 1; j<20; j++)
{
// System.out.println("ID Number: "+(names.get(j).id)+tab+" Name: "+tab+peopleMap.get(j).name+tab+" Birthdate: "+peopleMap.get(i).birthdate);
//Person p = names.get(j);
System.out.println(names.get(j).toString());
}
}
输出:
Person@10b30a7
Person@1a758cb
Person@1b67f74
Person@69b332
Person@173a10f
Person@530daa
Person@a62fc3
Person@89ae9e
Person@1270b73
Person@60aeb0
Person@16caf43
Person@66848c
Person@8813f2
Person@1d58aae
Person@83cc67
Person@e09713
Person@de6f34
Person@156ee8e
Person@47b480
谢谢嗯,我不能准确地指出问题所在,我有一些建议 地图没有排序。 通常,地图不会排序,因此您将无法对地图的键进行排序。如果要对地图进行排序,请使用SortedMap界面 尽可能使用泛型 可比较的接口是通用的。您可能应该执行类似的操作 那么您的compareTo方法应该如下所示:
public int compareTo(Person p) {
if (this.id > p.id) return 1;
else if (this.id < p.id) return -1;
else return 0;
}
使用@Override注释的重要性
每当您试图重写超类的方法或实现接口方法时,务必使用@Override注释,这一点很重要。以下是一些关于为什么这是一个好主意的链接:
我看到的一个问题是TreeMap按键排序,而不是按值排序。compareTo将不会用于树的排序,因为它是映射中的值。因为地图中的键是id,所以树中的项目应该按照人的id排序 你怎么知道地图没有排序?你能给我们看一些显示它不是的输出吗?你有没有可能在这个人进入地图后改变他的身份 哦,和人名地图相比,人名是什么?另外,ID是否真的从1开始连续?这段代码给出了什么:
for (Person person : peopleMap.values()) {
System.out.println(person);
}
您是否使用@Override方法来确保您实际上正在重写toString方法?看起来它仍然在打印出默认的toString,即指向对象的指针的值 参见:比较器API 比较器c对一组元素S施加的顺序称为与等于一致当且仅当compareObjecte1,Objecte2==0对于S中的每个e1和e2具有与e1.EqualObjectE2相同的布尔值 我在Person类中没有看到equals方法。equals的默认实现比较身份。如果重写equals,则必须定义哈希代码2 这个问题: 产出:
[Person<10>, Person<9>, Person<8>, Person<7>, Person<6>, Person<5>, Person<4>, Person<3>, Person<2>, Person<1>]
[Person<1>, Person<2>, Person<3>, Person<4>, Person<5>, Person<6>, Person<7>, Person<8>, Person<9>, Person<10>]
你能把compareTo方法的内容发布到网上吗?你是如何亲自实现这个可比较的界面的?@mmy,如果你回答我,我不会投票给你……我不想让人们认为我是你的傀儡P@Cody,请编辑您的问题,添加您刚才在评论中添加的内容。@Justin,是的,我添加了@mmyers:public int compareToobj{Person o=Person obj;if this.id==o.id{return 0;}if this.id>o.id{return 1;}if this.id
for (Person person : peopleMap.values()) {
System.out.println(person);
}
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
public class Person implements Comparable<Person> {
public final String name;
public final int id;
public final Date birthdate;
public Person(int id, String name, Date birthdate) {
this.id = id;
this.name = name;
this.birthdate = birthdate;
}
public static void main(String[] args) {
List<Person> list = new ArrayList<Person>();
for (int i = 10; i > 0; i--) {
list.add(new Person(i, "name" + String.valueOf(i), new Date()));
}
System.out.println(list);
Collections.sort(list);
System.out.println(list);
}
@Override
public boolean equals(Object other) {
if (!(other instanceof Person)) {
return false;
}
return this.id == ((Person)other).id;
}
@Override
public int hashCode() {
return 41 * id;
}
@Override
public String toString() {
return "Person<" + id + ">";
}
@Override
public int compareTo(Person other) {
if (!(other instanceof Person)) {
throw new IllegalArgumentException();
}
return this.id - ((Person)other).id;
}
}
[Person<10>, Person<9>, Person<8>, Person<7>, Person<6>, Person<5>, Person<4>, Person<3>, Person<2>, Person<1>]
[Person<1>, Person<2>, Person<3>, Person<4>, Person<5>, Person<6>, Person<7>, Person<8>, Person<9>, Person<10>]