LString class,用链表做字符串,java

LString class, using linked lists to make strings, java

我在为构建字符串的链表对象编写 compareTo()charAt() 方法时遇到问题。名为 LString 的 class 包含一个构造函数和一些其他方法。它与另一个文件一起运行,该文件测试其作为链表字符串生成器的能力,我收到此错误消息:

    Running constructor, length, toString tests (10 tests)
Starting tests: ..........
Time: 0.000
OK! (10 tests passed.)

Running compareTo and equals tests (18 tests)
Starting tests: EEEEEEEE.EEE.E....
Time: 0.016

There were 12 failures:
1) t21aTestCompareTo[0](LStringTest$LStringCompareToTest)
java.lang.AssertionError: compareTo of "abc" and "abd" wrong expected:<-1> but was:<0>
        at org.junit.Assert.fail(Assert.java:88)
        at org.junit.Assert.failNotEquals(Assert.java:743)
        at org.junit.Assert.assertEquals(Assert.java:118)
        at org.junit.Assert.assertEquals(Assert.java:555)
        at LStringTest$LStringCompareToTest.t21aTestCompareTo(LStringTest.java:259)
        ... 9 more
2) t22aTestEquals[0](LStringTest$LStringCompareToTest)
java.lang.AssertionError: equals of "abc" and "abd" wrong expected:<false> but was:<true>
        at org.junit.Assert.fail(Assert.java:88)
        at org.junit.Assert.failNotEquals(Assert.java:743)
        at org.junit.Assert.assertEquals(Assert.java:118)
        at LStringTest$LStringCompareToTest.t22aTestEquals(LStringTest.java:269)
        ... 9 more
3) t21aTestCompareTo[1](LStringTest$LStringCompareToTest)
java.lang.IndexOutOfBoundsException: bad index
        at LString.charAt(LString.java:91)
        at LString.compareTo(LString.java:64)
        at LStringTest$LStringCompareToTest.t21aTestCompareTo(LStringTest.java:259)
        ... 9 more
4) t22aTestEquals[1](LStringTest$LStringCompareToTest)
java.lang.NullPointerException
        at LString.equals(LString.java:79)
        at LStringTest$LStringCompareToTest.t22aTestEquals(LStringTest.java:269)
        ... 9 more
5) t21aTestCompareTo[2](LStringTest$LStringCompareToTest)
java.lang.IndexOutOfBoundsException: bad index
        at LString.charAt(LString.java:91)
        at LString.compareTo(LString.java:64)
        at LStringTest$LStringCompareToTest.t21aTestCompareTo(LStringTest.java:259)
        ... 9 more
6) t22aTestEquals[2](LStringTest$LStringCompareToTest)
java.lang.AssertionError: equals of "a" and "ab" wrong expected:<false> but was:<true>
        at org.junit.Assert.fail(Assert.java:88)
        at org.junit.Assert.failNotEquals(Assert.java:743)
        at org.junit.Assert.assertEquals(Assert.java:118)
        at LStringTest$LStringCompareToTest.t22aTestEquals(LStringTest.java:269)
        ... 9 more
7) t21aTestCompareTo[3](LStringTest$LStringCompareToTest)
java.lang.IndexOutOfBoundsException: bad index
        at LString.charAt(LString.java:91)
        at LString.compareTo(LString.java:64)
        at LStringTest$LStringCompareToTest.t21aTestCompareTo(LStringTest.java:259)
        ... 9 more
8) t22aTestEquals[3](LStringTest$LStringCompareToTest)
java.lang.AssertionError: equals of "abc" and "abcd" wrong expected:<false> but was:<true>
        at org.junit.Assert.fail(Assert.java:88)
        at org.junit.Assert.failNotEquals(Assert.java:743)
        at org.junit.Assert.assertEquals(Assert.java:118)
        at LStringTest$LStringCompareToTest.t22aTestEquals(LStringTest.java:269)
        ... 9 more
9) t22aTestEquals[4](LStringTest$LStringCompareToTest)
java.lang.AssertionError: equals of "B" and "a" wrong expected:<false> but was:<true>
        at org.junit.Assert.fail(Assert.java:88)
        at org.junit.Assert.failNotEquals(Assert.java:743)
        at org.junit.Assert.assertEquals(Assert.java:118)
        at LStringTest$LStringCompareToTest.t22aTestEquals(LStringTest.java:269)
        ... 9 more
10) t21aTestCompareTo[5](LStringTest$LStringCompareToTest)
java.lang.AssertionError: compareTo of "BB" and "Ba" wrong expected:<-1> but was:<0>
        at org.junit.Assert.fail(Assert.java:88)
        at org.junit.Assert.failNotEquals(Assert.java:743)
        at org.junit.Assert.assertEquals(Assert.java:118)
        at org.junit.Assert.assertEquals(Assert.java:555)
        at LStringTest$LStringCompareToTest.t21aTestCompareTo(LStringTest.java:259)
        ... 9 more
11) t22aTestEquals[5](LStringTest$LStringCompareToTest)
java.lang.AssertionError: equals of "BB" and "Ba" wrong expected:<false> but was:<true>
        at org.junit.Assert.fail(Assert.java:88)
        at org.junit.Assert.failNotEquals(Assert.java:743)
        at org.junit.Assert.assertEquals(Assert.java:118)
        at LStringTest$LStringCompareToTest.t22aTestEquals(LStringTest.java:269)
        ... 9 more
12) t22aTestEquals[6](LStringTest$LStringCompareToTest)
java.lang.NullPointerException
        at LString.equals(LString.java:79)
        at LStringTest$LStringCompareToTest.t22aTestEquals(LStringTest.java:269)
        ... 9 more

Test Failed! (12 of 18 tests failed.)

Test failures: abandoning other phases.

LString class 旨在模仿 Java 的 StringStringBuilder,但使用链表而不是数组。我对如何使用 this 关键字有点困惑。在下面的 compareTo() 方法中,我通过对自己说 "if this LStrings character at this index is equal to the argument's LString character at the same index, return 0."

来想象使用 this

我正在引用此页面,但不确定如何有效地编写它:http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#compareTo%28java.lang.String%29

如果 LString 具有完全相同的字符,我希望 compareTo() 到 return 0,如果此 LString 按字典顺序小于另一个 LString,则值小于零,如果它的值大于零字典序更大。

import java.io.*;
import java.util.*;

public class LString    {

     node   front;
     int size;

    //Creating a node class
     private    class   node {
          char data;
          node next;

          public    node (){
          }

          public    node    (char   newData){
                this.data = newData;
          }

          public    node    (char   newData,    node newNext){
                this.data = newData;
                this.next = newNext;
          }


     }
    //Constructors
     public LString(){
          this.size =   0;
          this.front =  null;
     }
     public LString(String original)    {
          this.size = original.length();
          if (original  !=  ""){

              this.front =  new node(original.charAt(0));
              node curr = this.front;

              for   (int i =1; i <  original.length(); i++) {
                    curr.next = new node(original.charAt(i));
                    curr = curr.next;
              }
          }



     }

   // Length method, returns the length of LString
     public int length()    {
        return this.size;
    }

    // compareTo method, compares this LString to anotherLString, returns 0 if equal,
   // -1 if lexicogrpahically less, and 1 if lexicographically greater
    public int compareTo(LString anotherLString)    {
      int total = 0;
      for (int i = 0; i < anotherLString.length(); i++) {
         total += this.charAt(i) - anotherLString.charAt(i);
      }
        return total;

        //}
        //return this.length()-anotherLString.length();
    }

   // a boolean equals method that returns true if LString and other are the same, false if not
    public boolean  equals(Object other)    {
        if  (other == null  ||  !(other instanceof LString)) {
            return false;
        }
        else {
            LString otherLString    = (LString)other;
         if (this.front.data == otherLString.front.data) {

               return true;
         }
        }
      return true;
    }

   // charAt returns the character of LString at the argument index
    public char charAt(int index)   {

        if ((index < 0) || (index >= this.length())) {
         throw new IndexOutOfBoundsException("bad index");
      }
      return this.front.data;
    }

有问题的方法在此代码中未完成。任何建议表示赞赏,努力学习 Java.

我稍微更正了你的代码。

如果定义equals(),则应定义hashCode()。 将 LString 实现为 CharSequence 也很有用。

public class LString implements Comparable<LString>
{
    Node front;
    int size;

    //Creating a node class
    private static class Node
    {
        char data;
        Node next;

        public Node()
        {
        }

        public Node( char newData )
        {
            this.data = newData;
        }

        public Node( char newData, Node newNext )
        {
            this.data = newData;
            this.next = newNext;
        }
    }

    //Constructors
    public LString()
    {
        this.size = 0;
        this.front = null;
    }

    public LString( String original )
    {
        this.size = original.length();
        if ( original.length() > 0 )
        {

            this.front = new Node( original.charAt( 0 ) );
            Node curr = this.front;

            for ( int i = 1; i < original.length(); i++ )
            {
                curr.next = new Node( original.charAt( i ) );
                curr = curr.next;
            }
        }
    }

    // Length method, returns the length of LString
    public int length()
    {
        return this.size;
    }

    // compareTo method, compares this LString to anotherLString, returns 0 if equal,
    // -1 if lexicogrpahically less, and 1 if lexicographically greater
    public int compareTo( LString anotherLString )
    {
        int len1 = length();
        int len2 = anotherLString.length();
        int lim = Math.min( len1, len2 );
        // char v1 = front.data;
        //   char v2 = anotherLString.front.data;
        Node cn1 = front;
        Node cn2 = anotherLString.front;

        int k = 0;
        while ( k < lim )
        {
            char c1 = cn1.data;
            char c2 = cn2.data;
            if ( c1 != c2 )
            {
                return c1 - c2;
            }
            k++;
            cn1 = cn1.next;
            cn2 = cn2.next;
        }

        return len1 - len2;
    }

    // a boolean equals method that returns true if LString and other are the same, false if not
    public boolean equals( Object other )
    {
        if ( this == other )
        {
            return true;
        }
        if ( other instanceof LString )
        {
            LString anotherLString = ( LString ) other;
            int n = length();
            if ( n == anotherLString.length() )
            {
                Node n1 = front;
                Node n2 = anotherLString.front;
                while ( n1 != null )
                {
                    if ( n1.data != n2.data )
                    {
                        return false;
                    }
                }

                return true;
            }
        }

        return false;
    }

    // charAt returns the character of LString at the argument index
    public char charAt( int index )
    {
        if ( ( index < 0 ) || ( index >= this.length() ) )
        {
            throw new IndexOutOfBoundsException( "bad index" );
        }

        Node curNode = front;
        for ( int i = 0; i < this.length(); i++, curNode = curNode.next )
        {
            if ( i == index )
            {
                return curNode.data;
            }
        }

        throw new IllegalStateException();
    }
}