在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
)`对于三链接列表?谢谢!这在事后看来很明显,哈哈。谢谢!这在事后看来很明显,哈哈。