2015-03-03 1 views
1

Je n'arrive pas à écrire des méthodes compareTo() et charAt() pour un objet de liste lié qui génère des chaînes. La classe, appelée LString contient un constructeur et quelques autres méthodes. Il fonctionne avec un autre fichier qui teste sa capacité en tant que constructeur de chaîne de liste chaînée, et je reçois ce message d'erreur:Classe LString, utilisation de listes chaînées pour créer des chaînes, java

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. 

La classe LString est censé imiter String et StringBuilder de Java, mais avec liés les listes au lieu de tableaux . Je suis un peu confus sur la façon d'utiliser le mot-clé this. Dans la méthode compareTo() ci-dessous, j'imagine en utilisant this en me disant "si ce caractère LStrings à cet index est égal au caractère LString de l'argument au même index, retourner 0".

Je référence à cette page, mais ne savez pas comment écrire efficacement: http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#compareTo%28java.lang.String%29

Je veux revenir compareTo() 0 si les LStrings ont les mêmes caractères précis, une valeur inférieure à zéro si ce LString est lexicographique moins qu'une autre chaîneLS et une valeur supérieure à zéro si elle est lexicographiquement supérieure.

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

Les méthodes en question ne sont pas terminées dans ce code. Tout conseil est apprécié, en essayant d'apprendre Java.

+0

juste FYI votre méthode de comapreTo va lancer une exception de pointeur NULL si 'anotherString' est plus grande que la chaîne sur laquelle méthode est appelée – Vihar

Répondre

1

J'ai légèrement corrigé votre code. Vous devez définir hashCode() si vous définissez equals(). Il est également utile d'implémenter LString en tant que 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(); 
    } 
} 
+0

En outre, vous voudrez peut-être override méthode toString() –