简体   繁体   中英

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?

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM