toString() 与递归 Java

toString() With Recursion Java

我的程序和提供的测试 class 有这个非常奇怪的问题。目标是 return 提供的确切格式的字符串。但是,当我 运行 测试 class 时,它告诉我我的字符串是错误的,即使它与测试 class 中的字符串完全相同。我不确定为什么它会作为不正确的字符串出现,即使字符串是正确的。谢谢! 这是 class:

public class RecursionLinkedList
{
private Node firstNode;
private int numberOfEntries;

public RecursionLinkedList()
{
        firstNode = null;
        numberOfEntries = 0;
}

public void add(int aData)
{
        if(numberOfEntries == 0)
        {
    firstNode = new Node(aData);
        }
        else
        {
            firstNode = new Node(aData, firstNode);
        }

    numberOfEntries++;
}

/**
 * boolean contains(int aData)
 * 
 * See whether this RecursionLinkedList contains aData
 * @param aData  a data to be located
 * @return true if this RecursionLinkedList contains aData,
 *         or false otherwise.
 */
public boolean contains(int aData)
{
        Node currentNode = firstNode;
        if(currentNode == null) {
    return false;
        }

        if(currentNode.data == aData) {
    return true;
        }

        else {
    return contains1(aData, currentNode);
        }
}

/**
 * int getFrequencyOf(int aData)
 * 
 * Counts the number of times a given data appears in this
 * RecursionLinkedList.
 * 
 * @param aData  the data to be counted
 * @return the number of times aData appears in this RecursionLinkedList
 */
public int getFrequencyOf(int aData)
{
        Node currentNode = firstNode;
        int frequency = 0;
        if(currentNode == null) {
    return frequency;
        }

        else {
            frequency = getFrequencyOf1(aData, currentNode);
    return frequency;
        }

}

/**
 * String toString()
 * 
 * Return a string representation of this RecursionLinkedList. For example,
 * if this RecursionLinkedList contains 1, 2, 3, 5, 2 and 3 from the first
 * index to the last index, the returned string should be
 * "[1,2,3,5,2,3]"
 * @return the string representation of this RecursionLinkedList.
 */
public String toString()
{
        Node currentNode = firstNode;
        String str1 = "[";
        String str = toString1(currentNode);
        String str2 = "]";
        return str1 + str + str2;   
}

/**
 * int getIndexOf(int aData)
 * 
 * Return the index of the first aData where the first index of
 * the first item in this RecursionLinkedList is 0.
 * 
 * @param aData  the data to be located
 * @return the index of the first aData.
 */
public int getIndexOf(int aData)
{
        Node currentNode = firstNode;
        int index = 0;
        if(currentNode == null) {
            return 0;
        }

        else {
            index = getIndexOf1(aData, currentNode);
            return index;
        }

}

    public boolean contains1(int aData, Node node)
    {
        Node currentNode = node;

        if(currentNode == null) {
            return false;
        }

        if(currentNode.data == aData) {
            return true;
        } 

        else {
            return contains1(aData, currentNode.next);
        }
 }

    public int getFrequencyOf1(int aData, Node node)
{
    Node currentNode = node;
            int frequency = 0;
    if(currentNode == null) {
                return frequency;
    }

    if(currentNode.data == aData) {
                frequency = 1 + getFrequencyOf1(aData, currentNode.next);
    }

    else {
                frequency = getFrequencyOf1(aData, currentNode.next);
    }
            return frequency;
}

    public String toString1(Node node)
{
    Node currentNode = node;

            if(currentNode == null) {
                return "\b";
            }

            else {
                int i = currentNode.data;
                String str = Integer.toString(i);
                String str1 = str + ","+toString1(currentNode.next);
                return str1;
            }

}

    public int getIndexOf1(int aData, Node node)
{
    Node currentNode = node;
    int index = 0;
    if(currentNode == null) {
                return 0;
    }

    if(currentNode.data == aData) {
                return index;
    }

    else {
                index = 1 + getIndexOf1(aData, currentNode.next);
                return index;
    }

}

private class Node
{
    private int data;
    private Node next;

    private Node(int aData, Node nextNode)
    {
        data = aData;
        next = nextNode;
    }

    private Node(int aData)
    {
        this(aData, null);
    }
}
}

这是测试 class:

import java.util.Random;


public class RecursionLLTester
{
public static void main(String[] args)
{
    RecursionLinkedList rll = new RecursionLinkedList();
    int point = 0;
    boolean isError = false;

    System.out.println("Create an empty RecursionLinkedList named rll.");

    System.out.print("Test the method contains() on an empty RecursionLinkedList: ");
    if(rll.contains(5) != false)
    {
        System.out.println("FAIL");
        System.out.println("Nothing is added into RecursionLinkedList rll.");
        System.out.println("rll.contains(5) should return 0.");
        System.out.println("But your rll.contains(5) returns " + rll.contains(5) + ".");
    }
    else
    {
        System.out.println("PASS");
        point++;
    }

    System.out.print("Test the method getFrequencyOf() on an empty RecursionLinkedList: ");
    if(rll.getFrequencyOf(5) != 0)
    {
        System.out.println("FAIL");
        System.out.println("Nothing is added into RecursionLinkedList rll.");
        System.out.println("rll.getFrequencyOf(5) should return 0.");
        System.out.println("But your rll.getFrequencyOf(5) returns " + rll.getFrequencyOf(5) + ".");
    }
    else
    {
        System.out.println("PASS");
        point++;
    }

    Random rand = new Random();
    int num = 20;
    int[] array = new int[5];
    for(int i = 0; i < 5; i++)
    {
        array[i] = 0;
    }

    System.out.println("Add the following integer into rll:");
    String s = "]";

    for(int i = 0; i < num  - 1; i++)
    {
        int temp = rand.nextInt(5);
        System.out.print(temp + " ");
        s = "," + temp + s;
        array[temp]++;
        rll.add(temp);
    }
    int temp = rand.nextInt(5);
    System.out.println(temp);
    s = "[" + temp + s;
    array[temp]++;
    rll.add(temp);


    System.out.println("\nTest the method contains() on a non-empty RecursionLinkedList");
    System.out.print("  - Test rll.contains(-1): ");
    if(rll.contains(-1) != false)
    {
        System.out.println("FAIL");
        System.out.println("No -1 has been added into the RecursionLinkedList rll.");
        System.out.println("rll.contains(-1) should return 0.");
        System.out.println("But your rll.contains(-1) returns " + rll.contains(-1));
    }
    else
    {
        System.out.println("PASS");
        point++;
    }

    for(int i = 0; i < 5; i++)
    {
        System.out.print("  - Test rll.contains(" + i + "): ");
        if(rll.contains(i) != (array[i] != 0))
        {
            System.out.println("FAIL");
            System.out.println("There are " + array[i] + " in RecursiveLinkedList rll.");
            System.out.println("rll.contains(" + i + ") should return " + (array[i] != 0));
            System.out.println("But your rll.contains(" + i + ") returns " + rll.contains(i));
            isError = true;
        }
        else
        {
            System.out.println("PASS");
        }
    }

    if(!isError)
    {
        point++;
        isError = false;
    }

    System.out.print("  - Test rll.contains(5): ");
    if(rll.contains(5) != false)
    {
        System.out.println("FAIL");
        System.out.println("No 5 has been added into the RecursionLinkedList rll.");
        System.out.println("rll.contains(5) should return 0.");
        System.out.println("But your rll.contains(5) returns " + rll.contains(5));
    }
    else
    {
        System.out.println("PASS");
        point++;
    }

    System.out.println("Test the method getFrequencyOf() on a non-empty RecursionLinkedList");
    System.out.print("  - Test rll.getFrequencyOf(-1): ");
    if(rll.getFrequencyOf(-1) != 0)
    {
        System.out.println("FAIL");
        System.out.println("No -1 has been added into the RecursionLinkedList rll.");
        System.out.println("rll.getFrequencyOf(-1) should return 0.");
        System.out.println("But your rll.getFrequencyOf(-1) returns " + rll.getFrequencyOf(-1));
    }
    else
    {
        System.out.println("PASS");
        point++;
    }

    for(int i = 0; i < 5; i++)
    {
        System.out.print("  - Test rll.getFrequencyOf(" + i + "): ");
        if(rll.getFrequencyOf(i) != array[i])
        {
            System.out.println("FAIL");
            System.out.println(i + " has been added to the RecursionLinkedList " + array[i] + " times.");
            System.out.println("rll.getFrequencyOf(" + i + ") should return " + array[i] + ".");
            System.out.println("But your rll.getFrequencyOf(" + i + ") returns " + rll.getFrequencyOf(i));
            isError = true;
        }
        else
        {
            System.out.println("PASS");
        }
    }

    if(!isError)
    {
        point++;
        isError = false;
    }

    System.out.print("  - Test rll.getFrequencyOf(5): ");
    if(rll.getFrequencyOf(5) != 0)
    {
        System.out.println("FAIL");
        System.out.println("No 5 has been added into the RecursionLinkedList rll.");
        System.out.println("rll.getFrequencyOf(5) should return 0.");
        System.out.println("But your rll.getFrequencyOf(5) returns " + rll.getFrequencyOf(5));
    }
    else
    {
        System.out.println("PASS");
        point++;
    }

    System.out.print("Test the method toString(): ");
    if(!s.equals(rll.toString()))
    {
        System.out.println("FAIL");
        System.out.println("rll.toString() should return the string \"" + s + "\".");
        System.out.println("But your rll.toString() returns the string \"" + rll.toString() + "\".");
    }
    else
    {
        System.out.println("PASS");
        point++;
    }


    System.out.println("Test the method getIndexOf()");
    System.out.println("Currently the rll is " + rll + ".");

    String[] str = rll.toString().split(",");
    str[0] = str[0].substring(1);
    str[str.length - 1] = str[str.length - 1].substring(0, 1);

    for(int i = -1; i <= 5; i++)
    {
        System.out.print("Test the method getIndexOf(" + i + "): ");
        if(getIndex(str,i) != rll.getIndexOf(i))
        {
            System.out.println("FAIL");
            System.out.println("The index of " + i + " should be " + getIndex(str,i) + ".");
            System.out.println("But your rll.getIndexOf(" + i + ") returns " + rll.getIndexOf(i) + ".");
            isError = true;
        }
        else
        {
            System.out.println("PASS");
        }
    }

    if(!isError)
    {
        point++;
        isError = false;
    }

    System.out.println("Your current point is " + point + ".");
}

public static int getIndex(String[] str, int s)
{
    int result = -1;

    for(int i = 0; i < str.length; i++)
    {
        if(s == Integer.parseInt(str[i]))
        {
            return i;
        }
    }

    return result;
}
}

问题出在您的 toString1(Node) 方法中。

    if (currentNode == null) {
        return "\b";
    }

\b 字符就是您在测试输出中最后看到的字符。

rll.toString() should return the string "[1,1,1,3,4,2,2,1,0,1,2,1,0,4,4,4,2,1,1,2]".

But your rll.toString() returns the string "[1,1,1,3,4,2,2,1,0,1,2,1,0,4,4,4,2,1,1,2,?]".

方法稍微调整如下,测试通过。

public String toString1(Node node)
{
    Node currentNode = node;
    if (currentNode == null) {
        return "\b";
    }
    int i = currentNode.data;
    String str = Integer.toString(i);
    if (currentNode.next != null) {
        str = str
            + "," + toString1(currentNode.next);
    } 
    return str;
}

尽管我建议您在此处更改一些内容:

  • 使用 StringBuilder 而不是所有的字符串连接。
  • 用循环替换递归。如果您的列表变得太大,您将使用该递归方法 运行 出栈 space。
  • 我不认为你想要 return 那个 \b 字符,因为它不代表一个整数而且你的 indexOf() 方法似乎对这个概念感到窒息还有。