Сортировка строк как вставленных в массив в Java

1

Я пытаюсь создать программу, которая принимает ввод пользователя и сортирует его по алфавиту, как это происходит при использовании compareTo String операций (не 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;

        }


}
  • 0
    Почему вы хотите сортировать по ходу дела? Сортировка один раз в конце означает, что вам не придется каждый раз перемещать все более поздние строки, и вы можете даже выполнить сортировку на месте. Если вы действительно нуждаетесь в сортировке всегда, вы должны использовать связанный список или некоторую другую структуру данных, которая не требует перемещения всего для вставки.
  • 0
    Это для задания для класса, который я беру. Я бы предпочел не делать этого, так как это было громоздко, но это часть требований.
Теги:
string
arrays
compareto

3 ответа

1
Лучший ответ

С этим кодом возникает ряд проблем. Сначала я отвечу на ваш ближайший вопрос, затем перечисляю некоторые другие проблемы.

Метод SortInsert принимает String[] которая будет инициализирована null значениями, поэтому вам нужно будет учитывать это. Цикл for будет выглядеть примерно так. (Я использую комментарии вместо написания фактического кода, так как я не делаю проект)

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
}

Теперь по другим вопросам.

  • У вас есть Scanner объект в main, который никогда не используется. Нет смысла иметь это и закрывать его в конце, если ваши другие методы сделают свое.
  • myArray всегда будет отсортированным массивом, поэтому нет смысла создавать локальную переменную с именем sortedArray и возвращать ее из SortInsert. Обратите внимание: ваша попытка распечатать sortedArray любом случае потерпит неудачу, потому что локальная переменная находится только в области видимости внутри цикла for.
  • При печати должен быть передан myArray в PrintArray.
0

Если вы собираетесь сортировать, как вы идете, структура данных TreeMap - это то, что вы должны использовать, а не массив. Однако, если вы хотите сортировать, как вы идете с массивом, вам нужно добавить некоторые строки в ваш else, если предложение в SortInsert (должно быть sortInsert, BTW). (Другой вопрос: почему это иначе, а не просто иначе?)

Строки должны создать новый массив размером больше, чем существующий массив, скопировать первые элементы i-1 старого массива в новый массив, поместить новый элемент в позицию i, а затем скопировать оставшиеся элементы старого массива в позиции одного больше в новом массиве.

  • 0
    Похоже, что массив должен иметь фиксированный размер, достаточно большой, чтобы вместить каждый элемент, поэтому создание нового массива - это просто дополнительные затраты.
  • 0
    @ MatthewПонимаю ... ты прав. Но затем мы должны отследить самый большой индекс, использованный до сих пор, и передать его в sortInsert, а также передать новый элемент и массив ... gah.
0

После того, как вы найдете позицию, в которую хотите вставить, вы должны перенести все следующие элементы на один. Что-то вроде следующего:

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;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню