Java中自定义链表的排序

Java中自定义链表的排序,java,sorting,linked-list,Java,Sorting,Linked List,我已经创建了自己的链表实现,它存储名字和姓氏。现在,我正试图按姓氏的字母顺序对名单进行排序,这是我遇到的问题。我读过关于可能使用collections.sort的文章,但我不确定如何修改我的类,以便使用collections.sort,或者这是否是一个好方法。下面是我到目前为止所做的。如果有人能在这方面帮助我,我将不胜感激。我想完成的是,当我打印它时,它将打印乔·罗杰斯、比尔·托马斯、格雷格·韦斯特,这意味着它是按姓氏排序的 编辑:谢谢大家的快速回复,我真的很感激 class Test { pu

我已经创建了自己的链表实现,它存储名字和姓氏。现在,我正试图按姓氏的字母顺序对名单进行排序,这是我遇到的问题。我读过关于可能使用collections.sort的文章,但我不确定如何修改我的类,以便使用collections.sort,或者这是否是一个好方法。下面是我到目前为止所做的。如果有人能在这方面帮助我,我将不胜感激。我想完成的是,当我打印它时,它将打印乔·罗杰斯、比尔·托马斯、格雷格·韦斯特,这意味着它是按姓氏排序的

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

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;
    }
}
}
}

您可以让您的类
myLink
实现
可比较的
接口。然后根据需要重写
compareTo()
方法。然后可以使用
Collections.sort(collection)进行排序

有关更多信息,请阅读

还要注意Java命名约定
myLink
应该是
myLink
等等


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

我将创建一个Person bean对象,该对象:

  • 包含名字和姓氏,以及
  • 实现可与姓氏上的排序相比较
然后,您所要做的就是将所有Person对象放入ArrayList中,并使用Collections.sort()将它们按正确的顺序排列

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

不,您也可以添加您的类。只需实现
Comparable
接口,然后将逻辑添加到重写的
compareTo()
方法中

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

示例代码: 公共静态void main(字符串[]args){ LinkedList l=新建LinkedList()


无需实现
compariable
接口即可实现

简单使用方法

示例代码:

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;
    }
});
Collections.sort(l,新的Comparator(){
@凌驾
公共整数比较(MyLink o1、MyLink o2){
int result=o1.last.compareTo(o2.last);
如果(结果==0){
结果=o1.第一个与(o2.第一个)相比;
}
返回结果;
}
});
注:

  • 永远不要为您的类使用内置类的名称,这样有时可能会造成混淆
  • 尊重Java命名约定

LinkedList适用于您。您只需要您的
Person
类和一个定制的
比较器,如下例所示

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);

    }

}
公共类人物{
先串;
最后一串;
公众人物(字符串f、字符串l){
这个。第一个=f;
这个。最后一个=l;
}
}
公共类链接示例{
公共静态void main(字符串[]args){
LinkedList pList=新建LinkedList();
pList.add(新的人(“第一”、“最后”));
pList.add(新的人(“BFirst”、“BLast”));
Collections.sort(pList,new Comparator(){
公共整数比较(人员p1、人员p2){
返回p1.last.compareTo(p2.last);
}
});
System.out.println(pList.pollFirst().last);
System.out.println(pList.pollFirst().last);
}
}

但是代码没有排序代码?您的问题是什么?“我不确定如何修改我的类以便使用collections.sort”-为什么不?您尝试过什么不起作用?我正在考虑使用collections.sort(l),但这不适用于我的实现。我只是想知道如何才能做到这一点?为什么不使用内置LinkedList?为什么要重新发明轮子?不,列表允许您添加单个对象。您可以有一个包含1000个字段的类。我不认为这样可以解决自定义LinkedList类中的问题。是的,它将ot帮助对自定义LL类进行排序。编辑了解决方法的答案。查看自定义linkedlist类谢谢,这正是我要查找的for@Gregwest85我对此表示怀疑,这种解决方案之所以有效,只是因为节点被添加到了Java自己的
LinkedList
类中——换句话说,这不是使用链表实现每个节点内的链接都指向错误的值。也许你不应该调用你的类
MyLink
,而应该调用它
Person
,并删除
next
属性,因为你根本没有使用它。@scarLópez请看一下OP注释。OP已经尝试使用buildin LinkedList,但是OP i除了字符串之外,它还面临一些需要添加的问题。如果LinkedList已经存在,则无需创建以相同方式运行的自定义类。
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;
    }
});
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);

    }

}