【问题标题】:Java: Three strings, lexicographic orderJava:三个字符串,字典顺序
【发布时间】:2014-01-30 19:01:38
【问题描述】:

这里是初级 Java 程序员。我正在尝试将三个字符串相互比较,并让系统按字典顺序吐出第二个/中间词。

import java.util.*;

public class Ordered2
{
public static void main(String[] args)
{
    String firstString, secondString, thirdString;

    Scanner keyboard = new Scanner(System.in);

    System.out.println("Enter three different strings.");
    System.out.println("The string in the middle order lexicographically will be displayed.");
    firstString = keyboard.nextLine();
    secondString = keyboard.nextLine();
    thirdString = keyboard.nextLine();

    String topString, middleString, bottomString;

    if (firstString.compareTo(secondString) > 0 && (firstString.compareTo(thirdString) > 0)) 
    { topString = firstString; }
    else if (firstString.compareTo(secondString) < 0 && (firstString.compareTo(thirdString) > 0)) {
    middleString = firstString; }
    else { bottomString = firstString; }

    if (secondString.compareTo(firstString) > 0 && (secondString.compareTo(thirdString) > 0)) {
    topString = secondString; }
    else if (secondString.compareTo(firstString) < 0 && (secondString.compareTo(thirdString) > 0)) {
    middleString = secondString; }
    else { bottomString = secondString; }

    if (thirdString.compareTo(secondString) > 0 && (thirdString.compareTo(firstString) > 0)) {
    topString = thirdString; }
    else if (thirdString.compareTo(secondString) < 0 && (thirdString.compareTo(firstString) > 0)) {
    middleString = thirdString; }
    else { bottomString = thirdString; }

    System.out.println("The second string in lexicographic order: " + middleString);
    }
}

这不会编译,并告诉我 middleString 尚未初始化。任何帮助将不胜感激。

【问题讨论】:

  • 如果您将代码格式化为更常规的格式,它会使您的代码非常更易于阅读 - 并在每个测试中去掉第二个条件周围的多余括号。
  • 错误信息说明了一切:存在理论上的执行路径,您在没有先初始化的情况下尝试使用 middleString。
  • 如果你只是想得到按字典顺序排列的“中间”字符串,而不关心你是怎么做的,把这些字符串放到一个 ArrayList 中,对它进行排序并取出中间的字符串。
  • Jon Skeet:对不起,我以后会更好地格式化。
  • Martin Dinov:希望我不必在意,但我们还没有在课堂上学习 ArrayLists,我想证明我可以用我们目前所学的内容进行编程。在所有选项中,我相信教授正在寻找 string.compareTo 方法。

标签: java compareto lexicographic


【解决方案1】:

Java 编译器不知道将执行if 语句的哪个分支。这意味着如果您在一个分支中初始化一个变量而不是另一个分支,则不能保证该变量具有分配给它的值。在您的代码中,所有变量当然都会被初始化,但是编译器无法知道这一点,因此您的错误。您可以将这三个初始化为 null 或空字符串。将String topString, middleString, bottomString; 替换为

String topString = null;
String middleString = null;
String bottomString = null;

此外,您可能希望使用 Java 的一些内置排序功能为您进行排序:

import java.util.*;

public class Ordered2
{
public static void main(String[] args)
{
    String firstString, secondString, thirdString;

    Scanner keyboard = new Scanner(System.in);

    System.out.println("Enter three different strings.");
    System.out.println("The string in the middle order lexicographically will be displayed.");
    firstString = keyboard.nextLine();
    secondString = keyboard.nextLine();
    thirdString = keyboard.nextLine();

    String[] array = new String[] {firstString, secondString, thirdString};

    Arrays.sort(array);

    System.out.println("The second string in lexicographic order: " + array[1]);
}
}

Arrays.sort() 为您排序字符串。从排序数组中取出第二个(索引 1)字符串会给你中间的字符串。如果要使用不区分大小写的排序方式,可以使用Arrays.sort(array, String.CASE_INSENSITIVE_ORDER)

【讨论】:

  • 这有帮助,但在程序结束时 middleString 仍然是“null”。例如,输入 'zebra' 'apple' 'honey' 作为我各自的字符串会产生以下结果:字典顺序中的第二个字符串:null。
  • @TGautier。现在怎么样?
  • @MadPhysicist 谢谢,我确信它可以工作,但我试图不使用数组或 TreeSet 或任何东西来解决这个问题。到目前为止,我只是想用我们在课堂上学到的东西来实现这一点。感谢您的帮助!
  • 您确定 Arrays.sort(java.lang.String) 存在,因为我遇到了异常???
  • @Neelam Arrays.sort(java.lang.String) 肯定不存在。 Arrays.sort(java.lang.String[]) 确实如此。
【解决方案2】:

您还没有初始化变量middleString 并在 pgrm 的末尾使用它作为

System.out.println("The second string in lexicographic order: " + middleString);

如下所示简单初始化变量即可编译。

String  middleString ="";

【讨论】:

    【解决方案3】:

    只需像这样初始化你的 3 个字符串 topString、middleString、bottomString 为空:

    String topString = "";
    String middleString = "";
    String bottomString = "";
    

    必须编译。

    【讨论】:

      【解决方案4】:

      这里的逻辑是错误的(我重新格式化了一下):

      if (firstString.compareTo(secondString) > 0 && (firstString.compareTo(thirdString) > 0)) 
          { topString = firstString; }
      else if (firstString.compareTo(secondString) < 0 && (firstString.compareTo(thirdString) > 0)) 
          { middleString = firstString; }
      else 
          { bottomString = firstString; }
      

      (我同意你的方法,我认为可以通过一些调整来实现。) 我将调用字符串 S1、S2、S3。假设所有字符串都不相等,则需要考虑四种情况。我已经列出了这些,以及上面的代码在做什么:

      S1 > S2 and S1 > S3    S1 is the top string   
      S1 > S2 and S1 < S3    S1 is the bottom string
      S1 < S2 and S1 > S3    S1 is the middle string
      S1 < S2 and S1 < S3    S1 is the bottom string
      

      其中一个是错误的。看到了吗?

      (我还没有检查其他两个if。你应该做同样的事情,每个看四个案例。)

      【讨论】:

      • 谢谢,这有帮助。我的逻辑是倒退的。我正在检查 secondString 是否大于 firstString,而从逻辑上讲,我最初试图检查 firstString 是否大于 secondString。通过代码翻转标志解决了我的问题。感谢大家的帮助!
      • @ajb 我在你的四个条件列表中发现了错误的条件......所以我们不需要每个字符串都有 4 个条件吗? “每个条件都需要四个条件”是什么意思?
      • @user3320018 我没有说“你需要四个条件”。我说有四种情况需要考虑。 S1S2(2 例),S1S3(2 例),2*2=4 例。这并不意味着您的代码中必须有四个条件。但是然而您编写代码,它必须适用于所有 4 种情况。 OP 尝试的代码仅适用于 4 个中的 3 个。
      【解决方案5】:

      如果我理解你的场景,你只对字符串感兴趣,你可以利用字符串的自然顺序并使用 JDK 类来帮助你:

      import java.util.ArrayList;
      import java.util.Collections;
      import java.util.List;
      import java.util.Scanner;
      
      public class StringSorter {
      
        public static void main(String[] args) {
          Scanner scanner = new Scanner(System.in);
      
          System.out.println("Enter the FIRST string:");
          String first = scanner.nextLine();
          System.out.println("Enter the SECOND string:");
          String second = scanner.nextLine();
          System.out.println("Enter the THIRD string:");
          String third = scanner.nextLine();
      
          List<String> strings = new ArrayList<String>();
      
          strings.add(first);
          strings.add(second);
          strings.add(third);
      
          System.out.println("Before sort:");
          for (String s : strings) {
            System.out.println(s);
          }
      
          Collections.sort(strings);
      
          System.out.println("After sort:");
          for (String s : strings) {
            System.out.println(s);
          }
      
          System.out.println("The Middle String is '" + strings.get(1) + "'");
      
          scanner.close();
      
        }
      
      }
      

      当我使用 John、JOHN 和 Kevin 作为名称在 Eclipse 中运行它(继续,粘贴并尝试一下!)时,我得到了以下结果:

      Enter the FIRST string:
      John
      Enter the SECOND string:
      JOHN
      Enter the THIRD string:
      Kevin
      Before sort:
      John
      JOHN
      Kevin
      After sort:
      JOHN
      John
      Kevin
      The Middle String is 'John'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-25
        • 2018-05-29
        • 2014-10-01
        • 2023-01-21
        • 1970-01-01
        相关资源
        最近更新 更多