Алфавитные строки 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();

Я знаю, что могу получить алфавитный порядок двух строк, используя:

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
ОП говорит: я должен использовать операторы 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 user1695423 Хорошо, я добавил еще немного подсказки, чтобы помочь вам начать работу. - person Code-Apprentice; 02.10.2012
comment
Если я сделаю wd1.compareTo(wd2), я получу целое число. Если оно меньше 0, сначала идет wd1, а если больше 0, то сначала идет слово 2. Я предполагаю, что все слова будут другими. - person user1695423; 02.10.2012
comment
@user1695423 user1695423 Давайте отойдем от деталей возвращаемого значения и просто поговорим об этом на английском языке. Если wd1 будет первым, что вы будете делать дальше? Если вместо этого на первом месте будет wd2, то что дальше? (Кроме того, вероятно, не стоит предполагать, что слова будут другими. Вы должны выяснить, что делать и в этом случае.) - person Code-Apprentice; 02.10.2012
comment
Если сначала будет wd1, я перейду дальше и сравню wd2 с wd3. Если бы wd2 был первым, я бы сравнил wd1 с wd3. Я вроде как понимаю концепцию того, что нужно сделать, но у меня возникают проблемы с кодированием. (Мне также не нужно беспокоиться о вводе одного и того же слова. Я позаботился об этом) - person user1695423; 02.10.2012
comment
@user1695423 user1695423 Вы хотите вывести слова в порядке возрастания или убывания? Если в порядке возрастания, может быть проще поменять местами сравнения. Я отредактирую свой вопрос с помощью некоторого псевдокода, включая это изменение. - person Code-Apprentice; 02.10.2012
comment
Это будет в алфавитном порядке, так что это будет в порядке возрастания. - person user1695423; 02.10.2012
comment
@user1695423 user1695423 Хорошо, посмотрите мое редактирование и дайте мне знать, что вы придумали. Если вы застряли в заполнении деталей псевдокода, я предлагаю вам отредактировать свой вопрос, чтобы включить то, что у вас есть до сих пор. Мы можем работать оттуда. - person Code-Apprentice; 02.10.2012
comment
Для меня это имеет гораздо больше смысла, когда я просто пишу то, что думаю, а затем конвертирую это в java. Это должен был быть первый навык, который они прошли в классе. Я закончу его и опубликую, когда закончу, надеюсь, работаю... спасибо! - person user1695423; 02.10.2012
comment
@user1695423 user1695423 Я также обнаружил, что запись вещей помогает прояснить мои предположения и даже выявить ошибки в моих предположениях. Это позволяет мне исправлять некоторые проблемы до того, как они попадут в код. Удачи с Java! - person Code-Apprentice; 02.10.2012
comment
Я считаю, что почти закончил. Я обновил свой код в первом сообщении. Я получаю сообщение об ошибке, потому что у меня есть два elses подряд. Мне не хватает, если где-то. Вы случайно не заметили? - person user1695423; 02.10.2012
comment
@ user1695423 п.с. Не забудьте принять ответ и проголосовать за любой, который был полезен. - person Code-Apprentice; 02.10.2012
comment
@user1695423 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

Для сравнения более двух строк вы должны поместить строки в массив, а затем запустить их через метод сортировки.

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