在Java中对自定义链接列表进行排序

时间:2014-07-13 20:09:11

标签: java sorting linked-list

我创建了自己的链表实现,它存储了名字和姓氏。现在我试图按姓氏的字母顺序对名称列表进行排序,这是我无法做到的。我已经阅读过有关可能使用collections.sort但我不知道如何修改我的类,所以我可以使用collections.sort或者如果这是一个很好的方式来解决它。以下是我到目前为止所做的工作。如果有人能帮助我,我将不胜感激。我想要完成的是,当我打印时,它将打印Joe Rogers,Bill Thomas,Greg West,这意味着它按姓氏排序。

编辑:感谢大家的快速回复,我真的很感激。

class Test {
public static void main(String[] args)
{
    LinkedList l = new LinkedList();

    l.insert("Greg", "West");
    l.insert("Joe", "Rogers");
    l.insert("Bill", "Thomas");

    l.print();

    Collections.sort(l) // I am unable to get this to work


}

public static class myLink {
public myLink next;
public String first;
public String last;

public myLink(String first, String last)
{
    this.first = first;
    this.last = last;
}

public void print()
{
    System.out.printf("%s %s\n",first,last);
}
}

public static class LinkedList {
private myLink linkedList;

public LinkedList() 
{
    linkedList = null;
}

public void insert(String first, String last)
{
    myLink li = new myLink(first, last);
    li.next = linkedList;
    linkedList = li;
}

public void print()
{
    myLink c = linkedList;
    while(c != null)
    {
        c.print();
        c = c.next;
    }
}
}
}

4 个答案:

答案 0 :(得分:1)

LinkedList适合您。您只需要Person课程和自定义Comparator,如下例所示。

public class Person {
    String first;
    String last;
    public Person(String f, String l) {
        this.first = f;
        this.last = l;
    }
}

public class LinkExample {

    public static void main(String[] args) {
        LinkedList<Person> pList = new LinkedList<Person>();
        pList.add(new Person("AFirst","ZLast"));
        pList.add(new Person("BFirst","BLast"));
        Collections.sort(pList, new Comparator<Person>() { 
           public int compare(Person p1, Person p2) {
            return p1.last.compareTo(p2.last);
           }
        });
        System.out.println(pList.pollFirst().last);
        System.out.println(pList.pollFirst().last);

    }

}

答案 1 :(得分:0)

您可以让您的班级myLink实施Comparable界面。然后根据您的要求覆盖compareTo()方法。然后您可以使用Collections.sort(collection);

进行排序

有关详细信息,请阅读documentation

还要注意Java命名约定。 myLink应为MyLink,依此类推......

这将对myLink的集合进行排序。但是,如果您想对自定义LinkedList类进行排序,我建议您在sort()中创建方法class LinkedList。在此方法中,创建一个包含所有myLink实例的列表(您已引用头部)。然后在此处调用Collections.sort()并返回Sorted Collection。

答案 2 :(得分:0)

我创建一个Person bean对象:

  • 包含名字和姓氏,以及
  • 实现Comparable以对姓氏进行排序

然后你要做的就是将所有Person对象放在ArrayList中,并使用Collections.sort()以正确的顺序获取它们。

答案 3 :(得分:0)

  

我尝试过使用Java的链表,但add方法只允许你使用单个字符串

不,你也可以添加你的课程。只需实现Comparable接口添加将您的逻辑放在重写的compareTo()方法中。

使用Collections.sort()对列表进行排序。

示例代码:     public static void main(String [] args){         LinkedList l = new LinkedList();

    l.add(new MyLink("Greg", "West"));
    l.add(new MyLink("Joe", "Rogers"));
    l.add(new MyLink("Bill", "Thomas"));

    Collections.sort(l);
    for(MyLink link:l){
        link.print();
    }
}

public static class MyLink implements Comparable<MyLink>{
    public MyLink next;
    public String first;
    public String last;

    public MyLink(String first, String last) {
        this.first = first;
        this.last = last;
    }

    public void print() {
        System.out.printf("%s %s\n", first, last);
    }

    @Override
    public int compareTo(MyLink o) {
        int result = this.last.compareTo(o.last);
        if(result==0){
            result = this.first.compareTo(o.first);
        }
        return result;
    }
}

输出:

Joe Rogers
Bill Thomas
Greg West

您可以在不实施Comparable界面的情况下实现它。

只需使用Collections.sort(List,Comparator)方法。

示例代码:

Collections.sort(l,new Comparator<MyLink>(){

    @Override
    public int compare(MyLink o1, MyLink o2) {
        int result = o1.last.compareTo(o2.last);
        if(result==0){
            result=o1.first.compareTo(o2.first);
        }
        return result;
    }
});

注意:

  • 永远不要在课堂上使用构建课程的名称,否则可能会造成混淆
  • 尊重Java命名约定。