【问题标题】:Sorting Strings as inserted into array in Java将字符串排序为插入Java中的数组
【发布时间】:2015-04-12 22:12:34
【问题描述】:

我正在尝试创建一个程序,该程序接受用户输入并在使用compareToString 操作(不是array.sort)时按字母顺序对其进行排序,并在最后打印最终排序的数组。我已经解决了这个问题的大部分内容,但是一旦我使用排序功能就迷失了。有人对我如何完成SortInsert 方法有任何想法吗?

import java.util.*;
public class SortAsInserted {

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int array_size = GetArraySize();
        String[] myArray = new String[array_size];
        for (int i = 0; i < array_size; i++){
            String nextString = GetNextString();
            String[] sortedArray = SortInsert(nextString, myArray);
        }
        PrintArray(sortedArray);
    }



        input.close();
        }

    }




    public static String[] SortInsert(String nextString, String[] myArray){
        for(int i = 0; i < myArray.length;)
            if (nextString.compareToIgnoreCase(myArray[i]) > 0) {
                i++;
                //if current text is less(alphabetically) than position in Array
            }else if (nextString.compareToIgnoreCase(myArray[i]) < 0){

            }

        }

    public static int GetArraySize(){
        Scanner input = new Scanner(System.in);
        System.out.print("How many items are you entering?: ");
        int items_in_array = input.nextInt();
        return items_in_array;


    }

    public static void PrintArray(String[] x) {
        for (int i = 0; i < x.length; i++){
            System.out.print(x[i]);
        }

    }

    public static String GetNextString(){
        Scanner input = new Scanner(System.in);
        System.out.println("Enter the next string: ");
        String next_string = input.nextLine();
        return next_string;

        }


}

【问题讨论】:

  • 为什么要边走边排序?最后排序一次意味着您不必每次都移动所有后面的字符串,您甚至可以就地进行排序。如果您确实需要始终对其进行排序,则应使用链表或其他不需要为插入移动所有内容的数据结构。
  • 这是我正在上的一门课的作业。我宁愿不这样做,因为它既麻烦又是要求的一部分。

标签: java arrays string compareto


【解决方案1】:

此代码存在许多问题。首先我会回答你的直接问题,然后列举其他一些问题。

SortInsert 方法采用 String[] 将使用 null 值进行初始化,因此您需要考虑到这一点。 for 循环看起来像这样。 (由于我不做项目,所以我使用 cmets 而不是编写实际代码)

for (int i=0; i<myArray.length; ++i) {
    if (myArray[i] == null) { 
        // we found a blank spot.  use it to hold nextString.
        break;
    } else if (nexString.compareToIgnoreCase(myArray[i]) < 0) { 
        // nextString should be in spot i, so make room for it
        // by shuffling along whatever is in the array at "i" and later
        // by one place, then put nextString into position "i"
        break;
    }
    // otherwise we'll just move to the next position to check
}

现在讨论其他问题。

  • main 中有一个从未使用过的 Scanner 对象。如果您的其他方法自己使用它,那么拥有它并在最后关闭它是没有意义的。
  • myArray 将始终是排序后的数组,因此创建一个名为 sortedArray 的局部变量并从 SortInsert 返回它是没有意义的。请注意,您尝试打印 sortedArray 无论如何都会失败,因为该局部变量仅在 for 循环的范围内。
  • 打印时应将myArray 传递给PrintArray

【讨论】:

    【解决方案2】:

    如果您要边走边排序,您应该使用 TreeMap 数据结构,而不是数组。但是,如果您想对数组进行排序,则需要在 SortInsert 的 else if 子句中添加一些行(应该是 sortInsert,顺便说一句)。 (另一个问题:为什么是 else if 而不仅仅是 else?)

    这些行应该创建一个大小比现有数组大一的新数组,将旧数组的前 i-1 个元素复制到新数组,将新元素放在位置 i,然后复制剩余的元素旧数组到新数组中大一的位置。

    【讨论】:

    • 看起来数组的大小是固定的,足以容纳每个元素,所以创建一个新数组只是额外的开销。
    • @MatthewRead 我明白了......你是对的。但是我们必须跟踪迄今为止使用的最大索引并将其传递给 sortInsert 以及传递新项目和数组...... gah。
    【解决方案3】:

    找到要插入的位置后,必须将以下所有元素向下移动一位。类似于以下内容:

    String temp = array[position];
    for (int j = position+1; j < array_size-1; j++) {
        String temp2 = array[j];
        array[j] = temp;
        temp = temp2;
    }
    array[array_size-1] = temp;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-07
      • 2020-07-28
      • 2020-11-12
      • 1970-01-01
      • 1970-01-01
      • 2010-11-13
      相关资源
      最近更新 更多