Объединение двух массивов строк в алфавитном порядке

У меня есть два массива строк, которые я пытаюсь объединить в один массив. Два массива расположены в алфавитном порядке. Я должен объединить их в алфавитном порядке. Я попытался сделать это, создав комбинированный список в виде первого списка, за которым следует второй список, а затем отсортировать их. К сожалению, мой инструктор моего класса говорит, что они хотят, чтобы я объединил и отсортировал их за один шаг, используя метод compareTo. Ниже мой код, как мне это сделать? Первые два массива представляют собой введенные пользователем значения в алфавитном порядке до 10 000 слов, а остальные — нулевые, например:

list1 = {"Альфред", "Бев", "Карл", "Дэн", null и т. д.)

list2 = {"Боб", "Крейг", "Дин", "Фрэн", ноль и т. д.)

list3 гол: {"Альфред", "Бев", "Боб", "Карл", Крейг, "Дэн", "Дин", "Фрэн"}

    for (int b = 0; b < list3.length; b++)//adds list1 to merged array 
    {
        if (list1[b] != null) {
            list3[b] = list1[b];
            f++;
        }

    }
    int x = 0;
    for (int y = f; y < list3.length; y++)//adds list2 to merged array
    {
        if (list2[x] != null) {
            list3[y] = list2[x];
            x++;
        }
    }

    for (int q = 0; q < list3.length; q++)//Merged array in alphabetical order
    {
        if (list3[q] != null) {
            for (int b = q; b < list3.length; b++) {
                if (list3[b] != null) {
                    if (list3[q].compareTo(list3[b]) > 0) {
                        String s = list3[q];
                        list3[q] = list3[b];
                        list3[b] = s;

                    }

                }
            }
        }

    }

Я впервые использую Stack Exchange, поэтому, надеюсь, все отформатировано правильно! Извините за любые ошибки.


person Marie Ohlinger    schedule 28.11.2017    source источник
comment
Отсутствие отступов делает ваш код очень трудным для понимания.   -  person shmosel    schedule 28.11.2017
comment
Похоже, вы показали нам старый код, который добавляет список 1, добавляет список 2, а затем сортирует совокупный список. Где код, который вы написали для их объединения и сортировки за один шаг?   -  person jarmod    schedule 28.11.2017
comment
Добро пожаловать в StackOverflow, если ответ/вопрос помог вам проголосовать за него, если ответ разрешил ваш вопрос, отметьте его как принятый.   -  person Marcos Vasconcelos    schedule 28.11.2017
comment
Проголосовали за отсутствие предварительных исследований и ленивое форматирование. Подсказка: это окно предварительного просмотра существует не просто так. И потом: имена имеют значение. s, q, b, ... — имена, которые ровно ничего не значат. Пожалуйста, поймите, что код написан для чтения людьми.   -  person GhostCat    schedule 28.11.2017
comment
Я не писал код для их объединения и сортировки, потому что это то, о чем я прошу. Я искал слияние и сортировку массивов, но единственный похожий вопрос касался объединения двух массивов int, в которых не использовалось compareTo. Можете ли вы дать ссылку на вопрос, который я дублирую? И еще раз извините за форматирование... Я запутался, как получить блок кода и отступ.   -  person Marie Ohlinger    schedule 28.11.2017
comment
@MarieOhlinger Если вы хотите, чтобы люди писали для вас весь код, вы ошиблись сайтом. Сделайте все возможное, чтобы выяснить, как вы можете адаптировать ответ на связанный вопрос к вашему варианту использования - например, просмотрите документацию. Трудно начать с этого, но очень, очень стоит усилий, когда вы хорошо в этом разбираетесь. (Я предполагаю, что вы новичок без особых причин; если нет, то то, что я сказал, применимо в два раза больше)   -  person Fund Monica's Lawsuit    schedule 29.11.2017


Ответы (2)


Если вы хотите объединить и отсортировать одновременно, вы можете реализовать InsertionSort в классе, который содержит массив String (который вы будете увеличивать в размере, когда вы добавляете новый или начинаете его с конечной длины).

Ваши шаги похожи на:

start with a array of lenght = list1.lenght + list2.lenght (called result here)
for each value on list1 and list2
compare if its lesser of the first element on the result array
if it is, add it before it and swap all list to the next position
if it is not, compare to the second and insert as its place if lesser and so on

Для слияния затем сортируйте:

Сортировка с использованием Arrays.sort(String[])

А также вы можете скопировать содержимое массивов с помощью метода System.arraycopy.

Ваш код может быть таким простым, как:

String[] list3 = new String[list1.lenght + list2.lenght];
System.arraycopy(list1, 0, list3, 0, list1.lenght);
System.arraycopy(list2, 0, list3, list1.lenght, list2.lenght);
Arrays.sort(list3);

Здесь list3 имеет желаемый результат.

person Marcos Vasconcelos    schedule 28.11.2017

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

    String[] array1 = new String[] { "Alfred", "Bev", "Carl", "Dan" };
    String[] array2 = new String[] { "Bob", "Craig", "Dean", "Fran" };

    List<String> list1 = Arrays.asList(array1);
    List<String> list2 = Arrays.asList(array2);

    List<String> combined = new ArrayList<String>();
    combined.addAll(list1);
    combined.addAll(list2);

    System.out.println("Unsorted list: "+ combined.toString());

    Collections.sort(combined);

    System.out.println("Sorted list: "+ combined.toString());

Вывод:

Unsorted list: [Alfred, Bev, Carl, Dan, Bob, Craig, Dean, Fran] 

Sorted list: [Alfred, Bev, Bob, Carl, Craig, Dan, Dean, Fran]
person kbz    schedule 28.11.2017