java如何根据人员的ID、姓名或出生日期订购包含人员的树状图或数组列表?
我几乎什么都试过了,但我似乎无法让我的清单自行排序。 下面是一些代码:
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方法,但由于某种原因,当我尝试打印地图时,它会给我hashcode(这就是hashcode,对吗?)Person@a62fc3. 下面是我在person类中的toString:
public String toString()
{
char tab = '\t';
return ("ID Number: "+id+tab+" Name: "+tab+name+tab+" Birthdate: "+(birthdate.toString()));
}
我应该补充一点,我不能在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
谢谢
# 1 楼答案
我看到的一个问题是
TreeMap
按键排序,而不是按值排序。您的compareTo
将不会用于树的排序,因为它是映射中的值。因为地图中的键是id,所以树中的项目应该按照人的id排序你怎么知道地图没有排序?你能给我们看一些显示它不是的输出吗?在
Person
放入地图后,您是否有可能更改其ID哦
names
与personMap
相比是什么?另外,ID是否真的从1开始连续?这段代码给出了什么:# 2 楼答案
嗯,我不能准确指出问题所在,我有一些建议
地图没有排序
通常,
Map
没有排序,因此您将无法对映射的键进行排序。如果要对Map
进行排序,请使用SortedMap
接口尽可能使用泛型
Comparable
接口是通用的。您可能应该实现Comparable<Person>
那么
compareTo()
方法应该如下所示:{a1}和{a2}
您需要查看
Comparator
接口以及Comparable
接口您的
Person
应该以您通常希望对一个人进行排序的方式实现Compariable。然后您应该编写一些Comparator
的实现使用
@Override
注释的重要性每当您试图重写超类的方法或实现接口方法时,务必使用@Override注释,这一点很重要。以下是一些关于为什么这是一个好主意的链接:
# 3 楼答案
请参阅:比较器API
“比较器c对一组元素S施加的顺序被称为与equals一致,当且仅当(compare((Object)e1,(Object)e2)==0)具有与e1相同的布尔值。S中的每个e1和e2都等于((Object)e2)。”
我在Person类中没有看到equals方法。equals的默认实现比较身份。如果重写equals,则必须定义哈希代码2
还有这个问题:Consistent Equals() results, but inconsistent TreeMap.containsKey() result
产出:
# 4 楼答案
您是否使用@Override方法来确保您实际上正在重写toString方法?看起来它仍在打印默认的toString()(即指向对象的指针的值)