User
User

Reputation: 1726

Am I comparing strings lexicographically correctly?

I am creating a method compareTo(AltString altStr2) that sorts strings by their length (shortest to longest).

However, I would like to go the extra mile and check for strings that are of the same length. In that case, I figure it is best to sort the strings lexicographically, so that they are sorted in the same way they would appear in the dictionary. So far my code is below.

public class AltString {

    String internalStr;

      public AltString(String str) {
        internalStr = str;
      }

      public String toString() {
        return internalStr;
      }

public int compareTo(AltString altStr2) {
      if (this.internalStr.length() < altStr2.internalStr.length()) {
          return -1;
      } else if (this.internalStr.length() > altStr2.internalStr.length()) {
          return 1;
      } else {
          int idx = 0;
          while (this.internalStr.charAt(idx) != altStr2.internalStr.charAt(idx)) {
              if (this.internalStr.charAt(idx) < altStr2.internalStr.charAt(idx)) {
                  return -1;
              }else if (this.internalStr.charAt(idx) > altStr2.internalStr.charAt(idx)) {
                  return 1;
              } else {
                  idx += 1;

public static void main(String[] args) {
        // some test code for the AltString class
        String [] list = {"fortran", "java", "perl", "python", "php", "javascrip", "c", "c++", "c#", "ruby"};
        AltString [] alist = new AltString[list.length];
        for (int i=0; i<alist.length; i++) {
          alist[i] = new AltString(list[i]);
        }

        Arrays.sort(list);
        Arrays.sort(alist);
        System.out.println("String sort:");
        for (int i=0; i<list.length; i++) {
          System.out.println(list[i]);
        }

        System.out.println("\nAltString sort:");
        for (int i=0; i<alist.length; i++) {
          System.out.println(alist[i]);
        }
      }

The part I am must stuck on is comparing the strings lexicographically. Currently, I have my code setup so that I enter a while-loop and compare each char.

My question is, is this the most efficient way to do this, or is there a better way to compare each string lexicographically in the cases where the strings are the same length?

Upvotes: 0

Views: 826

Answers (1)

Paul Boddington
Paul Boddington

Reputation: 37655

Following the suggestions of Tunaki and JB Nizet, you can use Integer.compare and String.compareTo. Using String.compareTo does not count as recursion. Recursion is when you call a method from itself, but String.compareTo is a different method from AltString.compareTo.

public int compareTo(AltString altStr2) {
    int temp = Integer.compare(this.internalStr.length(), altStr2.internalStr.length());
    return temp != 0 ? temp : this.internalStr.compareTo(altStr2.internalStr);  
}

Upvotes: 3

Related Questions