【问题标题】:Java Alphabetizing StringsJava 按字母顺序排列字符串
【发布时间】:2012-10-01 21:07:48
【问题描述】:

我有一个课程项目,我需要输入 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 语句而不是数组来执行此操作。

任何帮助都会很棒!

谢谢

【问题讨论】:

  • 是否允许使用任何类型的数据结构来存储字符串,例如数组或列表?
  • 查找“排序网络”。可以使用五个比较和交换(如果需要)操作的固定序列对任意四个输入进行排序。
  • 您的最新代码丢失{}s。确保将它们与每个 if 和每个 else 一起使用,即使它们不是必需的。这将帮助您避免现在看到的问题。

标签: java string sorting alphabetical


【解决方案1】:
boolean swapped = false;
do {
  swapped = false;
  if (w2.compareTo(w1) < 0) {
    String tmp = w2;
    w2 = w1;
    w1 = tmp;
    swapped = true;
  }
  if (w3.compareTo(w2) < 0) {
    String tmp = w3;
    w3 = w2;
    w2 = tmp;
    swapped = true;
  }
  if (w4.compareTo(w3) < 0) {
    String tmp = w4;
    w4 = w3;
    w3 = tmp;
    swapped = true;
  }
} while (swapped)

System.out.println(w1);
System.out.println(w2);
System.out.println(w3);
System.out.println(w4);

【讨论】:

  • 如何将其打印到屏幕上?
  • +1:基于 BubbleSort 算法的解决方案。进一步的解释会更好地让 OP 了解您的代码在做什么。
  • @user1695423 你只需要在这段代码之后打印 w1、w2、w3 和 w4。
【解决方案2】:

最简单的方法是将它们放在一个列表中,然后使用 list.sort() 将它们按顺序排列。

【讨论】:

  • OP 说:“我应该使用 if else 语句而不是数组来执行此操作。”这不可能是解决方案。
【解决方案3】:

将字符串放入List 并调用sort() 方法怎么样?

Java String 类实现了“Comparable”接口,因此已经有了compareTo() 方法,它应该按顺序比较字符串。

【讨论】:

  • 再读一遍这个问题。我对其进行了编辑以强调“非数组”片段。
【解决方案4】:

您需要将第一个字符串与其余三个字符串进行比较,以找出按字母顺序排列的第一个字符串。之后,您需要在其余 3 个之间进行比较,依此类推。

【讨论】:

    【解决方案5】:

    由于您无法使用数组或任何其他数据结构和排序算法,因此您需要使用多个 if 语句手动执行此操作。在您尝试编写任何代码之前,我建议您尝试手动执行此操作。如果我给你四个单词,你如何确定哪个是按字母顺序排列的第一个单词?第二?继续;如果你能用语言描述你是如何做到这一点的,那么翻译成 Java 应该是直截了当的。

    编辑:

    暂时不用担心 ASCII 码或任何与计算机相关的东西。不过,我想您确实需要考虑 compareTo() 一次只允许您比较两个单词的细节。因此,假设您选择 wd1wd2 进行比较。当你比较这两个“词”时,可能的结果是什么?在每种情况下,您接下来会做什么?

    另一个编辑:

    在cmets中讨论过,可以看到这里的算法是这样的(伪代码):

    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 中备份并修复描述。

    这基本上是我尝试编写计算机程序时使用的过程。我希望您可以将其中一些想法应用到您自己的编码中。

    【讨论】:

    • 手动我会先看a,然后看b,等等。在java中,我知道每个字符都由某个整数表示。将 .compareTo 用于两个不同的单词很容易,但我不明白如果不使用 do while 将如何处理四个单词
    • @user1695423 好的,我添加了一些提示来帮助您入门。
    • 如果我这样做wd1.compareTo(wd2),我会得到一个整数。如果它小于 0 wd1 首先出现,如果它大于 0 word 2 首先出现。我假设所有的词都会不同。
    • @user1695423 我们先抛开返回值的细节,简单的用英文说一下。如果wd1先出现,那么接下来你会做什么?如果取而代之的是wd2,那么接下来呢? (此外,假设单词会有所不同可能不是一个好主意。您也应该弄清楚在这种情况下该怎么做。)
    • 如果 wd1 先出现,我将继续比较 wd2 和 wd3。如果 wd2 先出现,我会将 wd1 与 wd3 进行比较。我有点理解需要做什么的概念,但在将其放入代码时遇到了麻烦。(我也不必担心输入相同的单词。我已经处理好了)
    【解决方案6】:

    可以应用典型的分歧和同意策略。考虑合并排序,排序前 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)
        }
      }
    }
    

    【讨论】:

      【解决方案7】:

      要比较两个以上的字符串,您应该将字符串放在一个数组中,然后通过排序方法运行它们

      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
      }
      }
      

      【讨论】:

        猜你喜欢
        • 2020-08-17
        • 1970-01-01
        • 2017-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多