在java中,根据用户输入以不同方式对链表进行排序时遇到问题

在java中,根据用户输入以不同方式对链表进行排序时遇到问题,java,linked-list,nodes,compareto,Java,Linked List,Nodes,Compareto,我这里有一个问题,我追踪到了这个方法。当然,如果需要,我可以提供更多的代码。我有一个文本文件,文件中的每一行都有一个不同的自行车。每行的格式为color::year::price。例如,一辆自行车可以是red::2008::150 我计划将这些信息存储在一个链接列表中,并希望能够按颜色、年份或价格进行订购。我不需要以后再排序。我只需要从文本文件中按正确的顺序插入它们。用户输入1、2或3,我创建一个新的链接列表,如LinkedList foo=new LinkedList(1),其中1表示应添加节

我这里有一个问题,我追踪到了这个方法。当然,如果需要,我可以提供更多的代码。我有一个文本文件,文件中的每一行都有一个不同的自行车。每行的格式为
color::year::price
。例如,一辆自行车可以是
red::2008::150

我计划将这些信息存储在一个链接列表中,并希望能够按颜色、年份或价格进行订购。我不需要以后再排序。我只需要从文本文件中按正确的顺序插入它们。用户输入1、2或3,我创建一个新的链接列表,如
LinkedList foo=new LinkedList(1)
,其中
1
表示应添加节点,使其按颜色按字母顺序排列
2和
3按照各自的顺序对其他变量进行排序。下面是我的一般实现的工作原理:

LinkedList color = new LinkedList(1);  //Should sort by color
LinkedList year = new  LinkedList(2);  //"" year
LinkedList price = new LinkedList(3);  //"" price

color.add(new Bike("a::1::1"));
year.add(new Bike("a::1::1"));
price.add(new Bike("a::1::1"));

color.add(new Bike("b::2::2"));
year.add(new Bike("b::2::2"));
price.add(new Bike("b::2::2"));

color.add(new Bike("c::3::3"));
year.add(new Bike("c::3::3"));
price.add(new Bike("c::3::3"));
上述所有三个链表中都应该存储相同的数据,并且应该以不同的顺序显示,但是所有三个链表都显示相同的顺序,最后一个元素被复制。它们看起来都像这样:

a::1::1
b::2::2
c::3::3
c::3::3
这显然是错误的。最后一行不应重复,每个链表应按不同顺序生成这些值。下面是我的
add()
代码,问题似乎就在这里。对于记录,LinkedList对象只包含一个节点,其
数据
下一个
值都具有
null

public void add(Object o){

    Node current = list;
    String currentString = "";
    String oString = o.toString().split("::")[sortOrder - 1];

    while(current.getNext() != null){
        current = current.getNext();
        currentString = current.getData().toString().split("::")[sortOrder - 1];
        //I do the 'sortOrder - 1' bit because when the user enters 1 
        //we should sort by the 0th element, 2 means sort by the 1st element, etc

        if(oString.compareTo(currentString) > 0){
            Node n = new Node(o);
            n.setNext(current.getNext());
            current.setNext(n);
            return;
        }
    }

    current.setNext(new Node(o));
}

您也可以考虑使用比较器来排序所需的列表,而不是修改排序逻辑。

这样,您只需要维护一个列表,就可以按您想要的方式对列表元素进行排序和显示


这里可以找到一个用法示例:

,您也可以考虑使用比较器来排序所需的列表,而不是修改排序逻辑。

这样,您只需要维护一个列表,就可以按您想要的方式对列表元素进行排序和显示


这里可以找到一个使用示例:

在循环中仔细检查您的条件。请记住,
x.compareTo(y)?=0
x?=y
完全相同,因此
oString.compareTo(currentString)>0
实际上意味着
oString>currentString

假设您有项目
10->20->30->null
。你插入了25个。您的
compareTo
行将首先显示“如果(25>10)在此节点后创建节点
n
”。您的列表将是“10->25->20->30->null”。相反,仅当
newItem>next
next==null
时,才需要在
current
之后插入项


希望这是一个手动创建链接列表的学校练习;将列表存储在
ArrayList
中一次,然后使用
Collections.sort(list,comparator)
根据用户输入对列表进行排序,这样做更有意义。

在循环中仔细检查您的条件。请记住,
x.compareTo(y)?=0
x?=y
完全相同,因此
oString.compareTo(currentString)>0
实际上意味着
oString>currentString

假设您有项目
10->20->30->null
。你插入了25个。您的
compareTo
行将首先显示“如果(25>10)在此节点后创建节点
n
”。您的列表将是“10->25->20->30->null”。相反,仅当
newItem>next
next==null
时,才需要在
current
之后插入项


希望这是一个手动创建链接列表的学校练习;将列表存储在
ArrayList
中并使用
Collections.sort(list,comparator)
根据用户输入对列表进行排序更有意义。

是否需要使用类似的字段重新创建
new Bike()
的对象
例如新自行车(“a::1::1
)`对于三链接列表?是否需要使用类似的字段重新创建
新自行车()
的对象?
例如新自行车(“a::1::1
)`对于三链接列表?谢谢!这在事后看来很明显,哈哈。谢谢!这在事后看来很明显,哈哈。