【问题标题】:Java- Manually sort a string array using compareTo() methodJava-使用 compareTo() 方法手动对字符串数组进行排序
【发布时间】:2018-02-15 07:14:45
【问题描述】:

首先让我说,我知道有更好的方法来排序你可能使用数组以外的东西。这是一个类的分配,用户可以将字符串存储在数组中,删除、显示和排序它们。我完全不知道从这里去哪里。我正在尝试使用冒泡排序,一切正常,除了我的数组中的第一个条目不会排序。我通过过滤掉空值来避免空指针异常,这就是我的 if 语句这么长的原因。

private void sortItems(String[] cargohold) {
    String temp;
    for (int i = 0; i < cargohold.length - 1; i++) {
        for (int j = 1; j < cargohold.length; j++) {
            if (cargohold[i] != null && cargohold[j] != null && (cargohold[i].compareTo(cargohold[j]) < 0)) {
                temp = cargohold[j];
                cargohold[j] = cargohold[i];
                cargohold[i] = temp;
            }   
        }
    }
}

我尝试了很多不同的方法来做到这一点,但我找不到任何很好的理由说明这不应该奏效。就示例而言,我已经查看了在 Stack Overflow 上可以找到的所有内容,没有人遇到与我相同的问题。

回顾一下,我可能有 5 个字符串,“Derp”、“Herp”、“Sam”、“Alfred”、“Bill”,这种排序会给我:“Derp”、“Alfred”、“Bill”、 “赫普”,“山姆”。提前感谢您的指导。

【问题讨论】:

  • 首先这不是冒泡排序,而是第一个问题
  • @WIR3D 你应该解释为什么它不是。冒泡排序的内部循环通常从i + 1 开始,而不是1。顺便说一句:请在类型之后写数组括号,而不是变量(String[] cargohold 而不是String cargohold[])。

标签: java arrays string sorting bubble-sort


【解决方案1】:

线

if(cargohold[i] != null && cargohold[j] != null && (cargohold[i].compareTo(cargohold[j]) < 0))

应该是

if(cargohold[j] != null && cargohold[j-1] != null && (cargohold[j].compareTo(cargohold[j-1]) < 0))

并且交换应该如下完成:

temp = cargohold[j];
cargohold[j] = cargohold[j-1];
cargohold[j-1] = temp;

请记住,在冒泡排序中,您比较相邻元素,而您的代码不会这样做。

缺陷

会有i &gt; ji &lt; j的情况,但是交换逻辑还是一样的,那是完全错误的。

【讨论】:

  • 您还需要跟踪某个元素是否已更改,以便您知道排序何时完成
  • @WIR3D,这是离散优化之一,您可以这样做,但这不是重点。
  • @SumeetSingh 你能解释一下为什么这与我的代码相反吗?
  • @user8570492 因为你没有比较相邻的元素,这就是你在bubbe sort中所做的。
  • @user8570492 如果你仔细观察,会有i>j和i
【解决方案2】:

经过一些优化的冒泡排序算法:

private static void sortItems(String cargohold[]) {
    String temp;
    boolean wasSwap = true;
    for (int index1 = 0; index1 < cargohold.length - 1 && wasSwap; ++index1) {
        wasSwap = false;
        for (int index2 = 0; index2 < cargohold.length - index1 - 1; ++index2) {
            if (cargohold[index2].compareToIgnoreCase(cargohold[index2+1]) > 0) {
                temp = cargohold[index2];
                cargohold[index2] = cargohold[index2+1];
                cargohold[index2+1] = temp;
                wasSwap = true;
            }
        }
    }
}

平均复杂度为O(n^2),最佳情况为O(n)

【讨论】:

    【解决方案3】:

    你的实现是错误的。

    这是冒泡排序(类似 java 的简写):

    for (index1 = 0; index1 < array.length - 1; ++index1)
        for (index2 = index1 + 1; index2 < array.length; ++index2)
            if (array[index1] < array[index1])
                swap(array[index1], array[index2]);
    

    注意内循环的index2 = index1 + 1

    【讨论】:

      【解决方案4】:
      String[] str = { "red", "blue", "green" };
      int n = str.length;
      String temp;
      System.out.println("Original String Array = " + Arrays.toString(str));
      for(int a=0;a<n;a++) {
          for(int b=a+1;b<n;b++) {
              if( str[a].compareTo(str[b]) > 0 ) {
                  temp = str[a];
                  str[a] = str[b];
                  str[b] = temp;
              }
          }
      }
      System.out.println("Sorted String Array = " + Arrays.toString(str));
      

      【讨论】:

      • 如果加上解释就更好了。
      猜你喜欢
      • 2012-08-20
      • 1970-01-01
      • 2020-04-09
      • 1970-01-01
      • 2011-11-12
      • 1970-01-01
      • 2014-05-11
      • 2013-09-12
      相关资源
      最近更新 更多