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它的值datanext值都对应。

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

2 回答 2

1

仔细检查循环中的条件。请记住,x.compareTo(y) ?= 0与 完全一样x ?= y,因此oString.compareTo(currentString) > 0是真正的意思oString > currentString

假设您有 items 10 -> 20 -> 30 -> null。您正在插入 25。您的compareTo行将首先说“如果 (25 > 10)n在此节点之后创建节点”。您的列表将是“10 -> 25 -> 20 -> 30 -> null”。相反,您要做的是current仅在 ifnewItem > next或之后插入项目next == null

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

于 2012-09-21T05:29:18.307 回答
0

您也可以考虑使用 Comparator 以您想要的方式对列表进行排序,而不是修改排序逻辑。

http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Comparator.html

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

可以在此处找到用法示例:http ://www.tutorialspoint.com/java/java_using_comparator.htm

于 2012-09-21T05:24:54.607 回答