我已经尝试了几乎所有的东西,而且我似乎无法让我的清单自行订购。 这是一些代码:
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;
这些值充满了randoms。我的约会日期格式。
我的person类中也有一个toString方法,但出于某种原因,当我尝试打印我的地图时,它给了我哈希码(这是哈希码对吗?)Person @ a62fc3。 这是我在字幕内的toString:
public String toString()
{
char tab = '\t';
return ("ID Number: "+id+tab+" Name: "+tab+name+tab+" Birthdate: "+(birthdate.toString()));
}
我应该补充一点,我无法在我的person类中调用我的toString方法。因为是打印人@ 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的代码不会打印它应该
的代码比较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());
}
}
输出: 人@ 10b30a7 人@ 1a758cb 人@ 1b67f74 人@ 69b332 人@ 173a10f 人@ 530daa 人@ a62fc3 人@ 89ae9e 人@ 1270b73 人@ 60aeb0 人@ 16caf43 人@ 66848c 人@ 8813f2 人@ 1d58aae 人@ 83cc67 人@ e09713 人@ de6f34 人@ 156ee8e 人@ 47b480
由于
答案 0 :(得分:0)
好吧,我无法确定确切的问题,我有一些建议。
通常,Map
未排序,因此您无法对地图的键进行排序。如果要对Map
进行排序,请使用SortedMap
界面。
Comparable
接口是通用的。您可能应该实施Comparable<Person>
然后您的compareTo()
方法应如下所示:
public int compareTo(Person p) {
if (this.id > p.id) return 1;
else if (this.id < p.id) return -1;
else return 0;
}
Comparator<Person>
和Comparable<Person>
您需要查看Comparator
界面以及Comparable
界面
您的Person
应该以您通常希望对某个人进行排序的方式实现可比性。然后你应该写一些Comparator
的实现。
public classPersonNameComparator implements Comparator<Person> {
public int compare(Person p1, Person p2) {
return p1.name.compareTo(p2.name);
}
}
@Override
注释每当您尝试覆盖超类的方法或实现接口方法时,始终使用@Override注释很重要。以下是一些关于为什么这是一个好主意的链接:
答案 1 :(得分:0)
我看到的一个问题是TreeMap
按键排序而不是按值排序。您的compareTo
将不会用于树的排序,因为它是地图中的值。由于地图中的关键字是id,因此树中的项目应按人员的ID进行排序。
你怎么知道地图没有排序?你能告诉我们一些输出显示它不是吗?您是否有机会在将Person
放入地图后更改其ID?
哦,与names
相比,personMap
是什么?此外,从1开始,这些ID真的是连续的吗?这段代码吐了什么:
for (Person person : peopleMap.values()) {
System.out.println(person);
}
答案 2 :(得分:0)
您是否使用@Override方法确保实际上覆盖了toString方法?看起来它仍然打印出默认的toString()(即指向对象的指针的值)。
答案 3 :(得分:0)
参见:比较器API。
“比较器c对一组元素S强加的顺序被认为与equals一致,当且仅当(compare((Object)e1,(Object)e2)== 0)具有相同的布尔值时对于S中的每个e1和e2,e1.equals((Object)e2)。“
我在Person类中没有看到equals方法。 equals的默认实现比较身份。如果重写equals,则必须定义hashCode 2。
这个问题:Consistent Equals() results, but inconsistent TreeMap.containsKey() result
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>]