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.
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