不确定如何实现排序列表Java

时间:2016-03-18 02:00:42

标签: java sortedlist

编辑3:简而言之,我要问的是如何修复我编写的代码以执行分配指令所要求的代码(在4个代码块的每个代码下面)。我不确定需要修复哪些内容才能使其按照说明进行操作。

我试图弄清楚如何为我正在进行的任务实施一些方法,但我似乎无法弄明白。下面的代码是我到目前为止的代码。

第一种方法是:

public boolean contains(int ID)
{
    // TODO: implement this method
    PersonNode current = m_first;
    PersonNode previous = null;
    if(current == null)
    {
        return false;
    }
    while(current != null)
    {
        if(current.getID() == ID)
        {
           return true;
           //previous = current;
           //current = current.getLink();
        }
        previous = current;
        current = current.getLink();
    }

    return false; // replace this statement with your own return
}

这是我到目前为止所做的,而且我不确定它是否应该是这样的。 赋值说明:此方法获取ID并检查与给定ID关联的PersonNode是否在列表中。如果是,则返回true,否则返回false。

第二种方法是:

public PersonNode get(int ID)
{
            // TODO: implement this method
    PersonNode current = m_first;
    PersonNode previous = null;
    if(current == null)
    {
        return null;
    }
    while(current != null)
    {
        if(current.getID() == ID)
        {
           return current.getLink();
           //previous = current;
           //current = current.getLink();
        }
        previous = current;
        current = current.getLink();
    }
    return null;
}

此方法的说明:此方法获取ID并检查与给定ID关联的PersonNode是否在列表中。如果是,则返回对节点的引用,否则返回null。

第三种方法是:

public boolean add(int ID, String name)
{
    // TODO: implement this method
    PersonNode newNode = new PersonNode(ID, name);
    PersonNode current = m_first;
    PersonNode previous = null;
    if(m_first == null)
    {
        m_first = newNode;
        m_numElements++;
        return true;
    }

    while(current != null)
    {
        if(current.getName().compareToIgnoreCase(previous.getName()) < 
        previous.getName().compareToIgnoreCase(current.getName())) //not sure, fix
        {
           previous = current;
           current = current.getLink();
        }
        else
        {
           break; //might be return false;
        }
    }
    if(previous == null)
    {
        newNode.setLink(m_first);
        m_first = newNode;
    }
    else
    {
        newNode.setLink(current);
        previous.setLink(newNode);
    }

    return false; // replace this statement with your own return
}

此方法的说明如下:此方法获取ID和名称,并将具有这些值的PersonNode添加到列表中。该列表仍必须按ID编号按升序排序。如果add成功,则返回true。如果节点已存在于列表中,则返回false。

最后一种方法是:

public boolean remove(int ID)
{
    // TODO: implement this method
    PersonNode current = m_first;
    PersonNode previous = null;
    boolean found = false;

    while(current != null)
    {
        if(current.getID() < ID)
        {
           previous = current;
           current = current.getLink();
        }
        else if(current.getID() == ID)
        {
           found = true;
           current = current.getLink();

           if(previous == null)
           {
              m_first = current;
           }
           else
           {
              previous.setLink(current);
           }
        }
        else
        {
           return found;
        }
    }

    return false; // replace this statement with your own return
}

此方法的说明:此方法获取ID并从列表中删除与给定ID关联的PersonNode。如果删除成功,则返回true。如果不存在此类节点,则返回false。

这就是我到目前为止所做的事情,我不确定我是否走在正确的轨道上,或者我是否完全离开了。

我需要帮助的摘要:

- 帮助实施这些方法。你不必提供代码(我不喜欢,如果你没有,但选择权是你的),但如果你这样做,请保持简单,所以我不必问一下。我只需要一些指导。任何帮助将不胜感激。

其他信息:

- 不允许实现其他方法或创建存在于这四种方法之外的变量。

- 有一个PersonNode类和一个测试类(不会发布代码,因为它很长,但是如果方法正确实现,它将起作用。) PersonNode类的代码:

public class PersonNode
{
private int m_ID;
private String m_name;
private PersonNode m_link;

public PersonNode(int ID, String name)
{
    m_ID = ID;
    m_name = name;
    m_link = null; 
}

public void setID(int ID)
{
    m_ID = ID;
}

public int getID()
{
    return m_ID;
}

public String getName()
{
    return m_name;
}

public void setName(String name)
{
    m_name = name;
}

public void setLink(PersonNode link)
{
    m_link = link;
}

public PersonNode getLink()
{ 
    return m_link;  
}

}

如果您可以在SO上找到其他可能有用的问题,请随时链接,但请务必先阅读我的帖子,不要只链接与排序列表相关的任何内容。我已经尝试过了,但我找到的那些对我的情况没那么有用。

如果有什么不清楚,我会编辑以使其更清晰。对不起,如果帖子真的很长。

编辑:我问的问题是如何让这些方法按照我在每个下面发布的说明进行操作。我不太确定我的代码是否接近指令。输出结果不正确,很可能是由于实现不正确。

编辑2:用我的新代码更新了contains()和get()。它的工作比以前更顺利,但仍然可以使用一些改进。另外,add()和remove()仍然需要工作。只需查看每段代码后面的段落,我需要帮助。我会经常检查,所以请随时伸出援助之手。

2 个答案:

答案 0 :(得分:1)

首先,在get()函数中,您需要返回ID匹配的PersonNode。因此,您应该return current而不是return current.getLink()current.getLink()似乎是链接列表的下一个节点。

其次,您的add()功能似乎做得不对。由于您的列表应始终排序,您可以从头开始迭代,直到您发现ID大于输入ID,这是您应该插入newNode的位置。

PersonNode newNode = new PersonNode(ID, name);
PersonNode currentNode = mFirst;

for(; currentNode.getLink().getID() < ID; currentNode = currentNode.getLink());
newNode.setLink(currentNode.getLink());
currentNode.setLink(newNode);

但是,您应该考虑一些可能导致此代码失败的条件:

列表为空

如果列表为空,则mFirst将为null。因此,当您调用currentNode.getLink()时,它将导致NullPointerException。所以你应该加上一些检查。

// insert when list is empty
if (mFirst == null) {
    mFirst = newNode;
    return true;
}

在第一个位置插入

如果您的新ID小于列表中的所有元素,则会导致代码插入第二个位置,而不是第一个位置。所以你可以在进入循环之前添加一个测试。

if (mFirst.getID() > ID) {
    // insert at front
    newNode.setLink(mFirst);
    mFirst = newNode;
}

在最后位置插入

如果您的新ID大于列表中的所有元素,则for循环将遇到NullPointerException。当您的currentNode是列表中的最后一个元素时,currentNode.getLink()将返回null,而当您调用currentNode.getLink()时,下一步将导致异常。因此,您需要在for循环中检查它(我用while循环替换它)。

while(true) {
    if (currentNode.getID() == ID) {
        // ID exists
        return false;
    }

    PersonNode nextNode = currentNode.getLink();
    if (nextNode == null) {
        // insert at last
        currentNode.setLink(newNode);
        return true;
    }
    if (nextNode.getID() > ID) {
        // insert at mid
        newNode.setLink(nextNode);
        currentNode.setLink(newNode);
        return true;
    }

    currentNode = nextNode;
}

最后,您的add()函数将如下所示:

PersonNode newNode = new PersonNode(ID, name);
PersonNode currentNode = mFirst;

// insert when list is empty
if (mFirst == null) {
    mFirst = newNode;
    return true;
}

if (mFirst.getID() > ID) {
    // insert at front
    newNode.setLink(mFirst);
    mFirst = newNode;
}

while(true) {
    if (currentNode.getID() == ID) {
        // ID exists
        return false;
    }

    PersonNode nextNode = currentNode.getLink();
    if (nextNode == null) {
        // insert at last
        currentNode.setLink(newNode);
        return true;
    }
    if (nextNode.getID() > ID) {
        // insert at mid
        newNode.setLink(nextNode);
        currentNode.setLink(newNode);
        return true;
    }

    currentNode = nextNode;
}

第三,是你的remove()功能。只需浏览列表并搜索特定ID即可。如果找到,将上一个节点链接到下一个节点。它与add()函数非常相似。

// remove when the list is empty
if (mFirst == null) {
    return false;
}

// remove at first
if (mFirst.getID() == ID) {
    mFirst = mFirst.getLink();
    return true;
}

PersonNode currentNode = mFirst,getLink();
PersonNode previousNode = mFirst;
while(true) {
    if (currentNode == null) {
        // ID not found
        return false;
    }

    if (currentNode.getID() == ID) {
        previouseNode.setLink(currentNode.getLinke());
        return true;
    }

    currentNode = currentNode.getLink();
}

在实施LinkedList结构时,请记住考虑可能导致代码失败并且注意指令顺序的条件

答案 1 :(得分:0)

我认为你的while循环没有结束,还有其他问题我找不到。

while(current != null)
{
    if(current.getID() == ID)
    {
       return true;
    }
}//how the while out?