繁体   English   中英

Java:三个字符串,按字典顺序

[英]Java: Three strings, lexicographic order

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尚未初始化。 任何帮助,将不胜感激。

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并将其在pgrm的末尾用作

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

如下简单地初始化变量,它将进行编译。

String  middleString ="";

只需将3个字符串topString,middleString,bottomString初始化为空即可,如下所示:

String topString = "";
String middleString = "";
String 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; }

(我会采用您的方法,我认为可以进行一些调整。)我将把字符串称为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 s。您应该做同样的事情,每个检查四个案例。)

如果我了解您的情况,那么您只对字符串感兴趣,则可以利用字符串的自然顺序并使用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'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM