0

我几乎尝试了所有方法,但我似乎无法让我的清单自行排序。这是一些代码:

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。这是我在 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 的代码不会打印它应该打印的内容

与我的 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@e人@de6f34 人@156ee8e 人@47b480

谢谢

4

4 回答 4

0

好吧,我无法确定确切的问题,我有一些建议。

地图未排序。

一般来说,anMap是未排序的,因此您将无法对地图的键进行排序。如果要排序,请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 注释很重要。以下是一些关于为什么这是一个好主意的链接:

于 2010-07-19T19:55:34.547 回答
0

我看到的一个问题是按键TreeMap排序而不是按值排序。您将不会用于树的排序,因为它是地图中的值。由于地图中的键是 id,因此树中的项目应按人员的 id 进行排序。compareTo

你怎么知道地图没有排序?你能向我们展示一些表明它不是的输出吗?您是否有机会在将Person其放入地图后更改其 ID?

哦,和什么names比较personMap?另外,从 1 开始的 id 真的是连续的吗?这段代码吐了什么:

for (Person person : peopleMap.values()) {
    System.out.println(person);
}
于 2010-07-19T19:59:03.140 回答
0

您是否使用 @Override 方法来确保您实际上覆盖了 toString 方法?看起来它仍在打印出默认的 toString() (即指向对象的指针的值)。

于 2010-07-19T20:32:52.320 回答
0

请参阅:比较器 API。

“当且仅当 (compare((Object)e1, (Object)e2)==0) 具有与 e1 相同的布尔值时,比较器 c 对一组元素 S 施加的排序被称为与 equals 一致。对 S 中的每个 e1 和 e2 都等于((Object)e2)。"

我在您的 Person 类中没有看到 equals 方法。equals 的默认实现比较身份。如果你覆盖equals,你必须定义hashCode 2。

还有这个问题:Consistent Equals() results, but compatible 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>]
于 2010-07-19T21:33:15.290 回答