【问题标题】:Bubble sort on 2D Array Java二维数组Java上的冒泡排序
【发布时间】:2014-06-10 14:37:28
【问题描述】:
String[][] 2dArray = new String[counter][2];
2dArray [counter][column1] = String.valueOf(counter);
2dArray [counter][column2] = "something something something";
for(int i = 0; i < 2dArray.length-1; i++){
     for(int j = i + 1; j > 0; j--){
       if(2dArray[i][j] < 2dArray[i-1][j]){ 
           int[][] temp = 2dArray[i-1][j];
           2dArray[i-1][j] = 2dArray[i][j];
           2dArray[i][j] = temp;                  
       }
     }
}

尝试对数组进行排序以使第 1 列升序。我研究了这里的其他参考资料并模仿了它们,但由于某种原因,我的 IDE 不喜欢上面的...

【问题讨论】:

  • "我的 IDE 不喜欢上述内容" 如果您遇到错误/异常,请在您的问题中发布。
  • 在 if 语句中的错误是;对于参数类型 java.lang.String、java.lang.String,运算符
  • 这意味着一个字符串不能小于其他字符串(或者至少 2 不能这样比较)。
  • 如果你有一个像"1" 这样的字符串并且你想要它的 int 值,你可以使用Integer.valueOf(someString)(其中 someString 是你从数组中拉出的字符串)。
  • String 类有compareTo method.use。您不能使用&lt; 来比较字符串

标签: java arrays bubble-sort


【解决方案1】:

如果我理解正确,我会建议以下内容:

您需要做的是比较数组的Integer 值:

if(Integer.valueOf(2dArray[i][0]) < Integer.valueOf(2dArray[i-1][0])){

您不包含j 的原因是您仅按第一列的值排序。 2dArray[i][0] 获取您在该特定行的 counter 的值。

我还在您的代码中看到了一些可以用来修复的其他内容:

for(int i = 0; i < 2dArray.length; i++){
  for(int j = i; j < 2dArray.length; j++){
    if(Integer.valueOf(2dArray[j][0]) > Integer.valueOf(2dArray[j+1][0])){
       String temp[] = 2dArray[j+1];
       2dArray[j+1] = 2dArray[j];
       2dArray[j] = temp;                  
    }
  }
}

这更符合我认为的 BubbleSort 的经典实现:

private static void bubblesort(Integer[] array) {
    for (int i = 0; i < array.length; i++) {
        for(int j = 0; j < array.length - 1; j++) {
            if(array[j].compareTo(array[j+1]) > 0) {
                swap(j, j+1, array);
            }
        }
    }

}

private static void swap(Integer index1, Integer index2, Integer[] array) {
    if(index1 == index2)return;
    Integer temp = new Integer(array[index2]);
    array[index2] = array[index1];
    array[index1] = temp;

}

除了您的情况,我将您的数组视为一维数组,因为您只按一维排序。

【讨论】:

  • 谢谢,吉特。当涉及到一维数组时,我理解冒泡排序,但二维数组让我失望。因此,如果我理解您对我的代码的更正,第二个 for 循环专门侧重于比较第一列的值?当你调用交换方法时,或者在我的情况下,在嵌套的 for 中交换时,你不必像 array[][] 那样引用数组结构?
  • 没错。您只需要比较第一列,因此您可以将其视为一维数组。当你说int temp[] = 2dArray[j-1];时,它基本上是一样的,你只是交换了一行而不是一个数据
  • 嗯……不喜欢; if(array[j].compareTo(array[j+1]) > 0),编译器状态:无法在数组类型 String[] 上调用 compareTo(String[])
  • @PadawanDeveloper 您正在使用通用实现。您应该为您的案例使用最顶层的实现
  • 应该 int temp[] = 2dArray[j-1];是字符串 temp []?我是一个新手,我知道,希望有一天这会成为第二天性。我也很期待与开发人员团队合作的那一天,因为这种没有头脑风暴会议的远程教育是为鸟类准备的。
【解决方案2】:

如果 2dArray 是像

这样的二维字符串数组

String[][] 2dArray

然后可以使用比较两个字符串

if(2dArray[i][j].compareTo(2dArray[i-1][j]) > 0)

【讨论】:

    【解决方案3】:

    这也能解决问题吗?

    for (int i = 0; i < 2dArray.length-1; i++){
    
              for(int j = 0; j < 2dArray.length-1; j++){
    
                  if(2dArray[j][0].compareTo(2dArray[j+1][0])>0){
    
                    String[] temp = 2dArray[j];
                    2dArray[j] = 2dArray[j+1];
                    2dArray[j+1] = temp;                  
                  }
              }
            }
    

    【讨论】:

    • 这也可以。基本相同,只是表达方式不同。
    • jeeter - 我仍然收到来自编译器的异常,您是否有机会将您的解决方案放入编译器进行测试?我会在这里粘贴我的其他代码,但它在没有数组“for”冒泡排序的情况下工作,所以它必须在“for”内。
    • 另外,我开始阅读有关 Collections 类库的文章,还有一些文章和帖子讨论了在当今世界如何使用 Collections 和 Array Lists 是一种更好的方法。那里有效吗?想知道我是否应该使用数组列表来研究 Collections.reverse() 吗?请记住,我正在上 Java 课程,所以现在我仍在学习基础知识...
    • ArrayLists 的问题是它们占用了更多的内存和处理能力来构建和访问。我现在也在旅途中,所以我无法访问 ide。不过很快就会发布更新
    • 好的,谢谢!!另一位发帖人建议我为这个问题声明一个具有两个属性的类,并将 item# 和 item 描述存储在一个数组中,而不是 2。我没有考虑过,但这似乎是一个好方法,并且会使我的排序更简单,至少在概念上是这样。
    【解决方案4】:
    for(int i=0;i<2dArray.length-2;i++){
        for(int j=0;j<2dArray[i].length-1;j++){
                if(2dArray[i][j]>2dArray[i+1][j]){
                    int temp=2dArray[i][j];
                    2dArray[i][j]=2dArray[i+1][j];
                    2dArray[i+1][j]=temp;
                }
        }
    }
    

    【讨论】:

    • 此代码将产生与 OP 已经得到的相同的错误。 (例如,您正在使用 &gt; 比较 2 个字符串)。
    • 这真的取决于......这家伙可能只需要一个提示来解决问题。
    • @MingtaoZhang 如果您发布的内容不能解决问题,那么它就不是答案(例如,不要发布)。
    【解决方案5】:
    char[][] temp = 2dArray[i-1][j];
    

    当您将 char/int/...(每个第一个响应)放入二维 char 数组时,您的 IDE 不喜欢您 (120%)。

    【讨论】:

    • 什么表明2dArray 包含字符?
    • 好问题。冒泡排序 (+60%),IDE 不满意 (+30%)。
    • 这些原因中的任何一个都不能说数组包含字符。
    • 2dArray[i][j] 未定义参数类型 char[], char[]"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    • 2020-09-13
    • 2021-10-31
    • 2010-12-23
    • 1970-01-01
    相关资源
    最近更新 更多