2015-03-03 72 views
1

我在爲構建字符串的鏈接列表對象編寫compareTo()charAt()方法時遇到問題。這個名爲LString的類包含一個構造函數和其他一些方法。它運行與測試其能力,作爲一個鏈表字符串生成另一個文件,我收到此錯誤信息:爲鏈接列表中的字符編寫compareTo()方法

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: EEEEEEEEEEEE...... 
Time: 0.015 

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.AssertionError: compareTo of "a" and "" 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:261) 
     ... 9 more 
4) t22aTestEquals[1](LStringTest$LStringCompareToTest) 
java.lang.AssertionError: equals of "" 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 
5) t21aTestCompareTo[2](LStringTest$LStringCompareToTest) 
java.lang.AssertionError: compareTo of "a" and "ab" 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 
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.AssertionError: compareTo of "abc" and "abcd" 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 
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) t21aTestCompareTo[4](LStringTest$LStringCompareToTest) 
java.lang.AssertionError: compareTo of "B" and "a" 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 
10) 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 
11) 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 
12) 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 

Test Failed! (12 of 18 tests failed.) 

Test failures: abandoning other phases. 

LString類是爲了模仿Java的StringStringBuilder,但鏈表而不是陣列。我對如何使用this關鍵字有點困惑。在下面的compareTo()方法中,我想象使用this通過對自己說:「如果此索引處的此LStrings字符等於同一索引處的參數的LString字符,則返回0.」

我引用此頁面,但不能確定如何將其有效地寫:http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#compareTo%28java.lang.String%29

我想compareTo()返回0,如果LStrings有相同的字符,值小於零,如果這LString排在最後少而不是另一個字符串,如果按字典順序更大,則其值大於零。

public class LString { 

    node front; 
    int size; 

    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; 
      } 


    } 

    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; 
      } 
     } 



    } 


    public int length() { 
     return this.size; 
    } 
    public int compareTo(LString anotherLString) { 
     for (int i = 0; i < this.length(); i++) { 
     if (this.charAt(i) == anotherLString.charAt(i)) { 
      return 0; 
     } 
     //other logic for returning 1 or -1 
     } 
     return this.length()-anotherLString.length(); 
    } 
    public boolean equals(Object other) { 
     if (other == null || !(other instanceof LString)) { 
      return false; 
     } 
     else { 
      LString otherLString = (LString)other; 
      return true; 
     } 
    } 
    public char charAt(int index) { 
     //return this.charAt(index)? 
    } 
} 

此代碼中的方法未完成。任何意見,讚賞,試圖學習Java。

+0

你應該比較'數據'嗎? 'data'是一個單一的'char'?爲什麼不使用'String'或'char []'? – Tdorno 2015-03-03 03:28:50

+0

我在比較他們的詞典值。 – rigatoni 2015-03-03 04:01:59

+0

答案在http://stackoverflow.com/questions/28824474/lstring-class-using-linked-lists-to-make-strings-java/28826014#28826014中給出 – 2015-03-03 14:04:16

回答

0
public int compareTo(LString anotherLString) { 
     for (int i = 0; i < this.length() && i<anotherLString.length(); i++) { 
      if (this.charAt(i) == anotherLString.charAt(i)) { 
       return 0; 
      } 
      else if(((int)this.charAt(i))<((int)anotherLString.charAt(i))) 
       return -1; 
      else 
       return 1; 
     } 
     return this.length()-anotherLString.length(); 
     } 

我認爲這個解決方案應該適合您的要求。我輸入了charint,然後比較它們以返回-1/1。此外,我還在for循環中添加了長度限制。

注:使用charAt(index)有效的解決方案在這裏,因爲你通過你的鏈接列表中的每個時間迭代你讀取字符。相反,您應該直接遍歷鏈表以進行比較。