Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中使用comparable对链表进行排序_Java - Fatal编程技术网

在Java中使用comparable对链表进行排序

在Java中使用comparable对链表进行排序,java,Java,我正在为一个作业写一个有序的链表。我们正在使用comparable,我正在努力让布尔加法正常工作。我已经花了两个星期的时间研究这段代码,现在我要斜视这段代码。我真的很感激对我的代码有新的认识 代码应该适用于可比较的数据-整数和字符串(但不能混合)。我可以让每一个工作,但不是一个代码代表所有。请帮我解决这个问题,这样代码可以用于字符串或整数 我只允许更改add()、remove()和OrderedListNode类 更新多亏了parkydr,我解决了一些问题,但是,我仍然得到一个零点错误。我正在测

我正在为一个作业写一个有序的链表。我们正在使用comparable,我正在努力让布尔加法正常工作。我已经花了两个星期的时间研究这段代码,现在我要斜视这段代码。我真的很感激对我的代码有新的认识

代码应该适用于可比较的数据-整数和字符串(但不能混合)。我可以让每一个工作,但不是一个代码代表所有。请帮我解决这个问题,这样代码可以用于字符串或整数

我只允许更改add()、remove()和OrderedListNode类


更新多亏了parkydr,我解决了一些问题,但是,我仍然得到一个零点错误。我正在测试int和string。如果字符串循环有一个“,这是我的最新版本的add。它没有设置prev链接(我将把它作为“读者练习”)

public boolean add(可比obj){
OrderedListNode节点=新OrderedListNode(obj);
//当列表为空时
if(head.next==tail)
{
head.next=节点;
node.next=tail;
tail.prev=节点;
返回true;
}
//当要添加的元素小于列表中的第一个元素时
if(对象比较(head.next.item)<0)
{
node.next=head.next;
head.next=节点;
返回true;
}
//当列表中有一个元素时
OrderedListNode当前=head.next;
OrderedListNode previous=头;
while(current!=tail&&node.item.compareTo(current.item)>=0)
{
先前=当前;
当前=当前。下一步;
}
previous.next=节点;
node.next=当前;
返回true;
}

这是我的最新版本的add。它没有设置上一个链接(我将把它作为“读者练习”)

public boolean add(可比obj){
OrderedListNode节点=新OrderedListNode(obj);
//当列表为空时
if(head.next==tail)
{
head.next=节点;
node.next=tail;
tail.prev=节点;
返回true;
}
//当要添加的元素小于列表中的第一个元素时
if(对象比较(head.next.item)<0)
{
node.next=head.next;
head.next=节点;
返回true;
}
//当列表中有一个元素时
OrderedListNode当前=head.next;
OrderedListNode previous=头;
while(current!=tail&&node.item.compareTo(current.item)>=0)
{
先前=当前;
当前=当前。下一步;
}
previous.next=节点;
node.next=当前;
返回true;
}

修改程序,输出为
1,3,33,4,4

如果您想要像
1,3,4,4,33这样的输出,请从以下程序中删除
第1行
第2行
,并粘贴以下代码。
Add
toString
方法已修改

int currentValue = Integer.parseInt(freshNode.theItem.toString());  
int tempValue = Integer.parseInt(nodeToTraverse.theItem.toString());
if(currentValue>tempValue)  

完整代码

/**
 * Class OrderedLinkedList.
 * 
 * This class functions as a linked list, but ensures items are stored in
 * ascending order.
 * 
 */
public class OrderedLinkedList {

    /**************************************************************************
     * Constants
     *************************************************************************/

    /** return value for unsuccessful searches */
    private static final OrderedListNode NOT_FOUND = null;

    /**************************************************************************
     * Attributes
     *************************************************************************/

    /** current number of items in list */
    private int theSize;

    /** reference to list header node */
    private OrderedListNode head;

    /** reference to list tail node */
    private OrderedListNode tail;

    /** current number of modifications to list */
    private int modCount;

    /**************************************************************************
     * Constructors
     *************************************************************************/

    /**
     * Create an instance of OrderedLinkedList.
     * 
     */
    public OrderedLinkedList() {
        // empty this OrderedLinkedList
//       clear();  //work around with this method. Removed temporarily.

    }

    /**************************************************************************
     * Methods
     *************************************************************************/

    /*
     * Add the specified item to this OrderedLinkedList.
     * 
     * @param obj the item to be added
     */
    public void add(Comparable obj) {
        OrderedListNode freshNode = new OrderedListNode(obj);
        if (head == null) {
            head = freshNode;
            tail = freshNode;
            return;
        }
        OrderedListNode nodeToTraverse = head;
        while(nodeToTraverse!=null)
        {
            int result = freshNode.theItem.compareTo(nodeToTraverse.theItem);  // line 1
            if(result>0)   // line 2
            {
                if(nodeToTraverse.next==null)
                {
                    nodeToTraverse.next=freshNode;
                    freshNode.prev =nodeToTraverse;
                    break;
                }
                else
                {
                    nodeToTraverse=nodeToTraverse.next;
                    continue;
                }
            }
            else
            {
                nodeToTraverse.prev.next = freshNode;
                freshNode.prev = nodeToTraverse.prev;
                freshNode.next= nodeToTraverse;
                nodeToTraverse.prev=freshNode;
                break;
            }
        }
    }

    /*
     * Remove the first occurrence of the specified item from this
     * OrderedLinkedList.
     * 
     * @param obj the item to be removed
     */
    public boolean remove(Comparable obj) {
        OrderedListNode curr = head;
        OrderedListNode prev = head;

        while (curr != null && !(curr.theItem.compareTo(obj) == 0)) {
            prev = curr;
            curr = curr.next;
        }
        if (curr == null)
            return false;
        else {
            prev.next = curr.next;
            curr = null;
            return true;
        }
    }

    /**
     * Empty this OrderedLinkedList.
     */
    public void clear() {
        // reset header node
        head = new OrderedListNode("HEAD", null, null);

        // reset tail node
        tail = new OrderedListNode("TAIL", head, null);

        // header references tail in an empty LinkedList
        head.next = tail;

        // reset size to 0
        theSize = 0;

        // emptying list counts as a modification
        modCount++;
    }

    /**
     * Return true if this OrderedLinkedList contains 0 items.
     */
    public boolean isEmpty() {
        return theSize == 0;
    }

    /**
     * Return the number of items in this OrderedLinkedList.
     */
    public int size() {
        return theSize;
    }

    /*
     * Return a String representation of this OrderedLinkedList.
     * 
     * (non-Javadoc)
     * 
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        String s = "";

        OrderedListNode temp = head;
        while (temp != null) {
            s = s + temp.theItem.toString()+",";
            temp = temp.next;
        }

        return s.substring(0,s.lastIndexOf(",")); //this will remove last comma
//      return s; //1,2,3,4,5,25,33, this will not remove last comma(,)
    }

    /**************************************************************************
     * Inner Classes
     *************************************************************************/

    /**
     * Nested class OrderedListNode.
     * 
     * Encapsulates the fundamental building block of an OrderedLinkedList
     * contains a data item, and references to both the next and previous nodes
     * in the list
     */

    // TODO: Implement the nested class OrderedListNode (5 points). This nested
    // class
    // should be similar to the nested class ListNode of the class LinkedList,
    // but
    // should store a data item of type Comparable rather than Object.

    // Remove - for testing only
    public static void main(String[] args) {
        OrderedLinkedList list = new OrderedLinkedList();
        /*list.add("1");
        list.add("4");
        list.add("3");
        list.add("33");
        list.add("5");
        list.add("2");
        list.add("25");*/
        list.add("1");
         list.add("4");
         list.add("3");
         list.add("33");
         list.add("4");

        System.out.println(list.toString());
    }

    private static class OrderedListNode {
        Comparable data;
        Comparable theItem;
        OrderedListNode next;
        OrderedListNode prev;

        OrderedListNode(Comparable data) {
            this(data, null, null);
        }

        OrderedListNode(Comparable data, OrderedListNode prev, OrderedListNode next) {
            this.theItem = data;
            this.next = next;
            this.prev = prev;
        }

        Comparable getData() {
            return data;
        }

        OrderedListNode getNext() {
            return next;
        }

        OrderedListNode getPrev() {
            return prev;
        }
        @Override
        public String toString() {
            return (String)theItem;
        }

    }
}

修改程序,输出将为
1,3,33,4,4

如果您想要像
1,3,4,4,33这样的输出,请从以下程序中删除
第1行
第2行
,并粘贴以下代码。
Add
toString
方法已修改

int currentValue = Integer.parseInt(freshNode.theItem.toString());  
int tempValue = Integer.parseInt(nodeToTraverse.theItem.toString());
if(currentValue>tempValue)  

完整代码

/**
 * Class OrderedLinkedList.
 * 
 * This class functions as a linked list, but ensures items are stored in
 * ascending order.
 * 
 */
public class OrderedLinkedList {

    /**************************************************************************
     * Constants
     *************************************************************************/

    /** return value for unsuccessful searches */
    private static final OrderedListNode NOT_FOUND = null;

    /**************************************************************************
     * Attributes
     *************************************************************************/

    /** current number of items in list */
    private int theSize;

    /** reference to list header node */
    private OrderedListNode head;

    /** reference to list tail node */
    private OrderedListNode tail;

    /** current number of modifications to list */
    private int modCount;

    /**************************************************************************
     * Constructors
     *************************************************************************/

    /**
     * Create an instance of OrderedLinkedList.
     * 
     */
    public OrderedLinkedList() {
        // empty this OrderedLinkedList
//       clear();  //work around with this method. Removed temporarily.

    }

    /**************************************************************************
     * Methods
     *************************************************************************/

    /*
     * Add the specified item to this OrderedLinkedList.
     * 
     * @param obj the item to be added
     */
    public void add(Comparable obj) {
        OrderedListNode freshNode = new OrderedListNode(obj);
        if (head == null) {
            head = freshNode;
            tail = freshNode;
            return;
        }
        OrderedListNode nodeToTraverse = head;
        while(nodeToTraverse!=null)
        {
            int result = freshNode.theItem.compareTo(nodeToTraverse.theItem);  // line 1
            if(result>0)   // line 2
            {
                if(nodeToTraverse.next==null)
                {
                    nodeToTraverse.next=freshNode;
                    freshNode.prev =nodeToTraverse;
                    break;
                }
                else
                {
                    nodeToTraverse=nodeToTraverse.next;
                    continue;
                }
            }
            else
            {
                nodeToTraverse.prev.next = freshNode;
                freshNode.prev = nodeToTraverse.prev;
                freshNode.next= nodeToTraverse;
                nodeToTraverse.prev=freshNode;
                break;
            }
        }
    }

    /*
     * Remove the first occurrence of the specified item from this
     * OrderedLinkedList.
     * 
     * @param obj the item to be removed
     */
    public boolean remove(Comparable obj) {
        OrderedListNode curr = head;
        OrderedListNode prev = head;

        while (curr != null && !(curr.theItem.compareTo(obj) == 0)) {
            prev = curr;
            curr = curr.next;
        }
        if (curr == null)
            return false;
        else {
            prev.next = curr.next;
            curr = null;
            return true;
        }
    }

    /**
     * Empty this OrderedLinkedList.
     */
    public void clear() {
        // reset header node
        head = new OrderedListNode("HEAD", null, null);

        // reset tail node
        tail = new OrderedListNode("TAIL", head, null);

        // header references tail in an empty LinkedList
        head.next = tail;

        // reset size to 0
        theSize = 0;

        // emptying list counts as a modification
        modCount++;
    }

    /**
     * Return true if this OrderedLinkedList contains 0 items.
     */
    public boolean isEmpty() {
        return theSize == 0;
    }

    /**
     * Return the number of items in this OrderedLinkedList.
     */
    public int size() {
        return theSize;
    }

    /*
     * Return a String representation of this OrderedLinkedList.
     * 
     * (non-Javadoc)
     * 
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        String s = "";

        OrderedListNode temp = head;
        while (temp != null) {
            s = s + temp.theItem.toString()+",";
            temp = temp.next;
        }

        return s.substring(0,s.lastIndexOf(",")); //this will remove last comma
//      return s; //1,2,3,4,5,25,33, this will not remove last comma(,)
    }

    /**************************************************************************
     * Inner Classes
     *************************************************************************/

    /**
     * Nested class OrderedListNode.
     * 
     * Encapsulates the fundamental building block of an OrderedLinkedList
     * contains a data item, and references to both the next and previous nodes
     * in the list
     */

    // TODO: Implement the nested class OrderedListNode (5 points). This nested
    // class
    // should be similar to the nested class ListNode of the class LinkedList,
    // but
    // should store a data item of type Comparable rather than Object.

    // Remove - for testing only
    public static void main(String[] args) {
        OrderedLinkedList list = new OrderedLinkedList();
        /*list.add("1");
        list.add("4");
        list.add("3");
        list.add("33");
        list.add("5");
        list.add("2");
        list.add("25");*/
        list.add("1");
         list.add("4");
         list.add("3");
         list.add("33");
         list.add("4");

        System.out.println(list.toString());
    }

    private static class OrderedListNode {
        Comparable data;
        Comparable theItem;
        OrderedListNode next;
        OrderedListNode prev;

        OrderedListNode(Comparable data) {
            this(data, null, null);
        }

        OrderedListNode(Comparable data, OrderedListNode prev, OrderedListNode next) {
            this.theItem = data;
            this.next = next;
            this.prev = prev;
        }

        Comparable getData() {
            return data;
        }

        OrderedListNode getNext() {
            return next;
        }

        OrderedListNode getPrev() {
            return prev;
        }
        @Override
        public String toString() {
            return (String)theItem;
        }

    }
}
import java.util.*;
公共班级名单{
专用节点头;
私有内部多节点;
公开名单(){
head=null;
多节点=0;
}
公共布尔值为空(){
返回((head==null)和&(manyNodes==0));
}
公共void添加(int元素){
if(head==null){
head=新节点(元素,空);
多节点++;
}否则{
head.addNodeAfter(元素);
多节点++;
}
}
公共布尔删除(int目标){
布尔值=假;
节点光标=头部;
节点前体;
if(head==null){
抛出新的NoSuchElementException(“无法从空列表中删除”);
}
if(head.getInfo()==目标){
head=head.getNodeAfter();
多节点--;
删除=真;
}否则{
前体=光标;
cursor=cursor.getNodeAfter();
而((光标!=null)&&(!已删除)){
if(cursor.getInfo()==目标){
preducer.removeNodeAfter();
多节点--;
删除=真;
}否则{
前体=光标;
cursor=cursor.getNodeAfter();
}
}
}
移除返回;
}
公共节点getFront(){
回流头;
}
公共整数大小(){
返回多节点;
}
公共节点列表排序(节点源){
震源=水头;
int最大=整数.MIN_值;
int最小;
节点锋;
while(源!=null){
if(source.getInfo()>最大值){
最大=source.getInfo();
}
source=source.getNodeAfter();
}
front=新节点(Node.find(head,最大).getInfo(),null);
移除(最大);
而(!isEmpty()){
震源=水头;
最小值=整数。最大值;
while(源!=null){
if(source.getInfo()
import java.util.*;
公共班级名单{
专用节点头;
私有内部多节点;
公开名单(){
head=null;
多节点=0;
}
公共布尔值为空(){
返回((head==null)和&(manyNodes==0));
}
公共空间添加(int e)
/**
 * Class OrderedLinkedList.
 * 
 * This class functions as a linked list, but ensures items are stored in
 * ascending order.
 * 
 */
public class OrderedLinkedList {

    /**************************************************************************
     * Constants
     *************************************************************************/

    /** return value for unsuccessful searches */
    private static final OrderedListNode NOT_FOUND = null;

    /**************************************************************************
     * Attributes
     *************************************************************************/

    /** current number of items in list */
    private int theSize;

    /** reference to list header node */
    private OrderedListNode head;

    /** reference to list tail node */
    private OrderedListNode tail;

    /** current number of modifications to list */
    private int modCount;

    /**************************************************************************
     * Constructors
     *************************************************************************/

    /**
     * Create an instance of OrderedLinkedList.
     * 
     */
    public OrderedLinkedList() {
        // empty this OrderedLinkedList
//       clear();  //work around with this method. Removed temporarily.

    }

    /**************************************************************************
     * Methods
     *************************************************************************/

    /*
     * Add the specified item to this OrderedLinkedList.
     * 
     * @param obj the item to be added
     */
    public void add(Comparable obj) {
        OrderedListNode freshNode = new OrderedListNode(obj);
        if (head == null) {
            head = freshNode;
            tail = freshNode;
            return;
        }
        OrderedListNode nodeToTraverse = head;
        while(nodeToTraverse!=null)
        {
            int result = freshNode.theItem.compareTo(nodeToTraverse.theItem);  // line 1
            if(result>0)   // line 2
            {
                if(nodeToTraverse.next==null)
                {
                    nodeToTraverse.next=freshNode;
                    freshNode.prev =nodeToTraverse;
                    break;
                }
                else
                {
                    nodeToTraverse=nodeToTraverse.next;
                    continue;
                }
            }
            else
            {
                nodeToTraverse.prev.next = freshNode;
                freshNode.prev = nodeToTraverse.prev;
                freshNode.next= nodeToTraverse;
                nodeToTraverse.prev=freshNode;
                break;
            }
        }
    }

    /*
     * Remove the first occurrence of the specified item from this
     * OrderedLinkedList.
     * 
     * @param obj the item to be removed
     */
    public boolean remove(Comparable obj) {
        OrderedListNode curr = head;
        OrderedListNode prev = head;

        while (curr != null && !(curr.theItem.compareTo(obj) == 0)) {
            prev = curr;
            curr = curr.next;
        }
        if (curr == null)
            return false;
        else {
            prev.next = curr.next;
            curr = null;
            return true;
        }
    }

    /**
     * Empty this OrderedLinkedList.
     */
    public void clear() {
        // reset header node
        head = new OrderedListNode("HEAD", null, null);

        // reset tail node
        tail = new OrderedListNode("TAIL", head, null);

        // header references tail in an empty LinkedList
        head.next = tail;

        // reset size to 0
        theSize = 0;

        // emptying list counts as a modification
        modCount++;
    }

    /**
     * Return true if this OrderedLinkedList contains 0 items.
     */
    public boolean isEmpty() {
        return theSize == 0;
    }

    /**
     * Return the number of items in this OrderedLinkedList.
     */
    public int size() {
        return theSize;
    }

    /*
     * Return a String representation of this OrderedLinkedList.
     * 
     * (non-Javadoc)
     * 
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        String s = "";

        OrderedListNode temp = head;
        while (temp != null) {
            s = s + temp.theItem.toString()+",";
            temp = temp.next;
        }

        return s.substring(0,s.lastIndexOf(",")); //this will remove last comma
//      return s; //1,2,3,4,5,25,33, this will not remove last comma(,)
    }

    /**************************************************************************
     * Inner Classes
     *************************************************************************/

    /**
     * Nested class OrderedListNode.
     * 
     * Encapsulates the fundamental building block of an OrderedLinkedList
     * contains a data item, and references to both the next and previous nodes
     * in the list
     */

    // TODO: Implement the nested class OrderedListNode (5 points). This nested
    // class
    // should be similar to the nested class ListNode of the class LinkedList,
    // but
    // should store a data item of type Comparable rather than Object.

    // Remove - for testing only
    public static void main(String[] args) {
        OrderedLinkedList list = new OrderedLinkedList();
        /*list.add("1");
        list.add("4");
        list.add("3");
        list.add("33");
        list.add("5");
        list.add("2");
        list.add("25");*/
        list.add("1");
         list.add("4");
         list.add("3");
         list.add("33");
         list.add("4");

        System.out.println(list.toString());
    }

    private static class OrderedListNode {
        Comparable data;
        Comparable theItem;
        OrderedListNode next;
        OrderedListNode prev;

        OrderedListNode(Comparable data) {
            this(data, null, null);
        }

        OrderedListNode(Comparable data, OrderedListNode prev, OrderedListNode next) {
            this.theItem = data;
            this.next = next;
            this.prev = prev;
        }

        Comparable getData() {
            return data;
        }

        OrderedListNode getNext() {
            return next;
        }

        OrderedListNode getPrev() {
            return prev;
        }
        @Override
        public String toString() {
            return (String)theItem;
        }

    }
}
import java.util.*;

public class List {

    private Node head;
    private int manyNodes;

    public List() {
        head = null;
        manyNodes = 0;
    }

    public boolean isEmpty() {
        return ((head == null) && (manyNodes == 0));
    }

    public void add(int element) {
        if (head == null) {
            head = new Node(element, null);
            manyNodes++;
        } else {
            head.addNodeAfter(element);
            manyNodes++;
        }
    }

    public boolean remove(int target) {
        boolean removed = false;

        Node cursor = head;
        Node precursor;

        if (head == null) {
            throw new NoSuchElementException("Cannot remove from empty list");
        }

        if (head.getInfo() == target) {
            head = head.getNodeAfter();
            manyNodes--;
            removed = true;
        } else {
            precursor = cursor;
            cursor = cursor.getNodeAfter();

            while ((cursor != null) && (!removed)) {
                if (cursor.getInfo() == target) {
                    precursor.removeNodeAfter();
                    manyNodes--;
                    removed = true;
                } else {
                    precursor = cursor;
                    cursor = cursor.getNodeAfter();
                }
            }
        }

        return removed;
    }

    public Node getFront() {
        return head;
    }

    public int size() {
        return manyNodes;
    }

    public Node listSort(Node source) {
        source = head;

        int largest = Integer.MIN_VALUE;
        int smallest;

        Node front;

        while (source != null) {
            if (source.getInfo() > largest) {
                largest = source.getInfo();
            }

            source = source.getNodeAfter();
        }

        front = new Node(Node.find(head, largest).getInfo(), null);
        remove(largest);

        while (!isEmpty()) {
            source = head;
            smallest = Integer.MAX_VALUE;

            while (source != null) {
                if (source.getInfo() <= smallest) {
                    smallest = source.getInfo();
                }

                source = source.getNodeAfter();
            }

            remove(smallest);
            front.addNodeAfter(smallest);
        }

        head = front.reverse(front);
        source = head;
        return source;
    }

    public void showList() {
        Node cursor = head;

        if (cursor == null) {
            System.out.println("This list contains no items.");
        } else {
            while (cursor != null) {
                System.out.print(cursor.getInfo() + " ");
                cursor = cursor.getNodeAfter();
            }
        }
    }

}//end class List