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 的 String
和 StringBuilder
,但使用链表而不是数组。我对如何使用 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();
}
}
我在为构建字符串的链表对象编写 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 的 String
和 StringBuilder
,但使用链表而不是数组。我对如何使用 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();
}
}