Азбучно подреждане на низове в Java

Имам проект за клас, където трябва да получа 4 различни въведени низа и след това да ги изведа по азбучен ред.

Досега имам това:

String wd1, wd2, wd3, wd4;
    Scanner scan1 = new Scanner(System.in);

    System.out.println ("Type Word One: ");
    wd1 = scan1.next();

    System.out.println ("Type Word Two: ");
    wd2 = scan1.next();

    System.out.println ("Type Word Three: ");
    wd3 = scan1.next();

    System.out.println ("Type Word Four: ");
    wd4 = scan1.next();

Знам, че мога да получа азбучния ред на 2 низа, като използвам:

int compare = wd1.compareTo(wd2);


    if (compare < 0)
    {System.out.println(wd1 + " " + wd2);}
    else {
        if (compare > 0)
        {System.out.println(wd2+ " " + wd1);}

Имам нужда от помощ, за да подредя всичките 4 низа в правилния ред. Предполага се да използвам изрази if else, а не масиви, за да направя това.

Всяка помощ би била чудесна!

Благодаря


person user1695423    schedule 01.10.2012    source източник
comment
Имате ли право да използвате всякакъв вид структура от данни за съхраняване на низовете, като масив или списък?   -  person Matt Ball    schedule 02.10.2012
comment
Потърсете мрежи за сортиране. Възможно е да сортирате всякакви четири входа, като използвате фиксирана последователност от пет операции за сравнение и размяна, ако е необходимо.   -  person Ian Roberts    schedule 02.10.2012
comment
В най-новия ви код липсват {}s. Не забравяйте да ги използвате с всеки if и всеки else, дори ако не са задължителни. Това ще ви помогне да избегнете проблеми, каквито виждате сега.   -  person Code-Apprentice    schedule 02.10.2012


Отговори (7)


Най-лесният начин да направите това, което търсите, е да ги поставите в списък, след което да използвате list.sort(), за да ги подредите.

person Charles Munger    schedule 01.10.2012
comment
OP казва: Предполага се, че използвам изрази if else, а не масиви, за да направя това. Това не може да е решението. - person Luiggi Mendoza; 02.10.2012

Какво ще кажете да поставите низовете в List и да извикате метода sort()?

Класът Java String имплементира интерфейса „Comparable“ и по този начин вече има метода compareTo(), който трябва да сравнява низовете по ред.

person midhunhk    schedule 01.10.2012
comment
Прочетете въпроса още веднъж. Редактирах го, за да подчертая не фрагмента от масиви. - person Luiggi Mendoza; 02.10.2012

Трябва да сравните първия низ с останалите три, за да намерите кой е първи по азбучен ред. след това трябва да сравните между останалите 3 и така нататък.

person midhunhk    schedule 01.10.2012

Тъй като не можете да използвате масиви или друга структура от данни и алгоритъм за сортиране, ще трябва да направите това ръчно с няколко оператора if. Преди да опитате да напишете какъвто и да е код, предлагам ви да опитате да го направите на ръка. Ако ви дам четири думи, как бихте определили коя е първата по азбучен ред? Секундата? Продължавай; ако можете да опишете как правите това с думи, преводът на Java трябва да е лесен.

Редактиране:

Не се притеснявайте за ASCII код или нещо, свързано с компютър в момента. Предполагам, че трябва да вземете предвид детайла, че compareTo() ви позволява да сравнявате само две думи наведнъж. Да приемем, че избирате wd1 и wd2 за сравнение. Когато сравните тези две „думи“, какви са възможните резултати? Във всеки случай какво ще правите след това?

Друга редакция:

След обсъждане в коментарите можете да видите, че алгоритъмът тук е нещо подобно (в псевдокод):

if wd1 comes before wd2
    if wd1 comes before wd3
        if wd1 comes before wd4
            print out wd1 // wd1 is the first word in alphabetical order
        else
            print out wd4 // wd4 is the first word in alphabetical order
    else
        // Details left as an exercise to the reader
else
    // Details left as an exercise to the reader

Завършете попълването на операторите else първо на английски, като следвате същия модел, илюстриран тук. Когато приключите с това, писането на кода в Java трябва да е доста просто.

Както можете да видите, "разбирането на концепцията" често не е достатъчно, за да започнете да пишете кода. Трябва да отделите време, за да разберете всички мъчителни подробности. Често откривам, че помага да напиша стъпките на английски с химикал и хартия (или може би текстообработваща програма), преди дори да започна да пиша код. (Разбира се, можете да използвате собствения си роден език, ако това е по-лесно. Въпросът е да НЕ скачате на компютъра и да започнете да пишете Java код от самото начало, особено когато сте блокирани.)

Когато можете да опишете стъпките на родния си език, тогава преводът на Java става по-лесен. Понякога е тривиално. Друг път попадате на детайл, който не е взет предвид в описанието ви на естествен език. След това архивирате далеч от Java и коригирате описанието, преди да продължите с Java.

Това е основно процесът, който използвам, когато се опитвам да напиша компютърна програма. Надявам се, че можете да адаптирате някои от тези идеи към вашето собствено кодиране.

person Code-Apprentice    schedule 01.10.2012
comment
На ръка бих погледнал първо a, след това b и т.н. В Java знам, че всеки знак е представен от определено цяло число. Лесно е да използвате .compareTo за две различни думи, но не разбирам как бихте го направили за четири думи, без да използвате do while - person user1695423; 02.10.2012
comment
@user1695423 Добре, добавих още малко съвет, който да ви помогне да започнете. - person Code-Apprentice; 02.10.2012
comment
Ако направя wd1.compareTo(wd2), ще получа произведено цяло число. Ако е по-малко от 0, първо идва wd1, а ако е по-голямо от 0, първо идва дума 2. Предполагам, че всички думи ще бъдат различни. - person user1695423; 02.10.2012
comment
@user1695423 Нека се отдръпнем от подробностите за върнатата стойност и просто да говорим за това на английски. Ако wd1 е на първо място, тогава какво ще направите след това? Ако вместо това wd2 е първо, тогава какво следва? (Също така, вероятно не е добра идея да се предполага, че думите ще бъдат различни. Трябва да разберете какво да направите и в този случай.) - person Code-Apprentice; 02.10.2012
comment
Ако wd1 е първи, ще продължа напред и ще сравня wd2 с wd3. Ако wd2 е на първо място, бих сравнил wd1 с wd3. Донякъде разбирам концепцията за това какво трябва да се направи, но имам проблеми с въвеждането му в код. (Също така не е нужно да се притеснявам за въвеждането на същата дума. Погрижих се за това) - person user1695423; 02.10.2012
comment
@user1695423 Искате ли да извеждате думите във възходящ или намаляващ ред? Ако са във възходящ ред, може да е по-лесно да превключвате сравненията си. Ще редактирам въпроса си с някакъв псевдокод, включително тази промяна. - person Code-Apprentice; 02.10.2012
comment
Ще бъде в азбучен ред, така че ще бъде във възходящ ред. - person user1695423; 02.10.2012
comment
@user1695423 Добре, вижте редакцията ми и ми кажете какво сте измислили. Ако се затрудните да попълвате подробностите на псевдокода, предлагам ви да редактирате въпроса си, за да включите това, което имате досега. Можем да работим от там. - person Code-Apprentice; 02.10.2012
comment
За мен има много повече смисъл, когато просто напиша това, което мисля, и след това го конвертирам в java. Това трябваше да е първото умение, което преминаха в клас. Ще го довърша и ще го публикувам, когато свърша, надявам се да работя... благодаря! - person user1695423; 02.10.2012
comment
@user1695423 Също така намирам, че писането на неща помага за изясняването на моите предположения и дори разкрива грешки в моите предположения. Това ми позволява да коригирам някои проблеми, преди да бъдат въведени в кода. Успех с твоята Java! - person Code-Apprentice; 02.10.2012
comment
Вярвам, че почти съм готов. Актуализирах кода си в първия пост. Получавам грешка, защото имам две други подред. Липсва ми ако някъде. Случайно да го забележите? - person user1695423; 02.10.2012
comment
@user1695423 p.s. Не забравяйте да приемете отговор и да гласувате за всеки, който е бил полезен. - person Code-Apprentice; 02.10.2012
comment
@user1695423 Моля, редактирайте въпроса си или публикувайте нов с текущия си код. Включете грешки на компилатора, ако има такива, и изход. Опишете защо е различно от очакваното и какъв според вас може да е проблемът. Тук има много хора, които са готови да помогнат, ако ни дадете достатъчно информация. - person Code-Apprentice; 02.10.2012

Може да се приложи типична стратегия за разделяне и съгласие. Помислете за сортиране чрез сливане, сортирайте първите 2 и последните 2 низа, след това резултатите от сливането.

if(s2<s1) swap(s1,s2)
if(s4<s3) swap(s3,s4)

if(s1<s3) {
  print(s1)
  if(s2<s3){
    print(s2)
    print(s3)
    print(s4)
  } else {
    print(s3)
    if(s2<s4){
      print(s2)
      print(s4)
    } else {
      print(s4)
      print(s2)
    }
  }
} else {
  print(s3)
  if(s4<s1){
    print(s4)
    print(s1)
    print(s2)
  } else {
    print(s1)
    if(s4<s2){
      print(s4)
      print(s2)
    } else {
      print(s2)
      print(s4)
    }
  }
}
person Rrr    schedule 04.10.2012

За да сравните повече от 2 низа, трябва да поставите низовете в масив и след това да ги пуснете чрез метод за сортиране

public class SortLetters2 {
public String[] sort(String[] asd) {
    String[] sorted = asd.clone();
    for (int i = 0; i < sorted.length; i++) {
        for (int j = i + 1; j < sorted.length; j++) {
            int compare = sorted[i].compareTo(sorted[j]);
            if ((compare > 0) && (i != j)) {
                //compare two strings
                String temp = sorted[j];
                sorted[j] = sorted[i];
                sorted[i] = temp;
            }
        }
    }
    return sorted;
}
public static void main(String[] args) {
    SortLetters2 list1 = new SortLetters2();
    //SortLetters2 is the class name
    Scanner scan1 = new Scanner(System.in);
    String wd1, wd2, wd3, wd4;
    System.out.println("Type Word One: ");
    wd1 = scan1.next();
    System.out.println("Type Word Two: ");
    wd2 = scan1.next();
    System.out.println("Type Word Three: ");
    wd3 = scan1.next();
    System.out.println("Type Word Four: ");
    wd4 = scan1.next();
    String array[] = {wd1, wd2, wd3, wd4};
    //set array equal to the inputs
    String[] sortedArray = list1.sort(array);
    for (int i = 0; i < sortedArray.length; i++) {
        if (i == sortedArray.length - 1) {
            System.out.println(sortedArray[i]);
        } else {
            System.out.print(sortedArray[i] + ",");
        }
    }
    //run sorting program
}
}
person Steven LaFever    schedule 22.06.2015

person    schedule
comment
Как това ще бъде отпечатано на екрана? - person user1695423; 02.10.2012
comment
+1: Решение, базирано на алгоритъма BubbleSort. Допълнително обяснение би било по-добре за OP, за да разбере какво прави вашият код. - person Luiggi Mendoza; 02.10.2012
comment
@user1695423 просто трябва да отпечатате w1, w2, w3 и w4 след тази част от кода. - person Luiggi Mendoza; 02.10.2012