2015-03-03 3 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 класса предназначен для имитации String и StringBuilder, но с Linked Lists в Java вместо массивов , Я немного запутался в том, как использовать ключевое слово this. В приведенном ниже методе compareTo(), я полагаю, используя , говоря себе: «Если этот символ LStrings в этом индексе равен символу LString аргумента в том же индексе, верните 0.»

Я ссылки на эту страницу, но не знаете, как эффективно писать: http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#compareTo%28java.lang.String%29

Я хочу compareTo() возвращать 0, если LStrings имеют те же символы, значение меньше нуля, если это LString лексикографически меньше чем другой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

+0

Я сравниваю их лексикографические ценности. – rigatoni

+0

Ответ приведен в http://stackoverflow.com/questions/28824474/lstring-class-using-linked-lists-to-make-strings-java/28826014#28826014 –

ответ

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

Я думаю, что это решение должно работать нормально для вашего требования. У меня есть тип casted char до int, а затем сравнили их с возвратом -1/1. Кроме того, я также добавил ограничение длины на цикл for.

Примечание: Использование charAt(index) является не эффективного решения здесь, так как вы итерация через связной список каждый раз, когда вы запрашиваете характер. Вместо этого вы должны перебирать ваш связанный список напрямую для сравнения.

Смежные вопросы