【问题标题】:Am I comparing strings lexicographically correctly?我是否正确地按字典顺序比较字符串?
【发布时间】:2015-11-15 19:59:34
【问题描述】:

我正在创建一个方法compareTo(AltString altStr2),它按字符串的长度(从最短到最长)对字符串进行排序。

但是,我想加倍努力并检查长度相同的字符串。在这种情况下,我认为最好按字典顺序对字符串进行排序,以便它们的排序方式与它们在字典中出现的方式相同。到目前为止,我的代码如下。

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

我必须坚持的部分是按字典顺序比较字符串。目前,我有我的代码设置,以便我进入一个while循环并比较每个字符。

我的问题是,这是最有效的方法吗,或者在字符串长度相同的情况下,是否有更好的方法来按字典顺序比较每个字符串?

【问题讨论】:

  • 你知道字典排序是字符串的默认排序吗?
  • 对不起,你什么意思?
  • @OmarN Tunaki 表示在else 位中你可以只做return this.internalStr.compareTo(altStr2.internalStr);
  • @PaulBoddington,明白了。我添加了其余的代码。
  • @OmarN 不,这不是递归。递归是当您从自身内部调用方法时。你没有那样做。 String.compareTo 是与 AltString.compareTo 不同的方法。他们只是碰巧同名。

标签: java compareto lexicographic


【解决方案1】:

按照 Tunaki 和 JB Nizet 的建议,您可以使用 Integer.compareString.compareTo。使用String.compareTo 不算作递归。递归是当您从自身调用方法时,但String.compareToAltString.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);  
}

【讨论】:

    猜你喜欢
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 2018-05-17
    相关资源
    最近更新 更多